My earlier post received this comment which is a pretty neat little improvement over the one from g-truc.net.
Here it is, with one further tweak:
template<typename T, std::size_t N>
constexpr
std::integral_constant<std::size_t, N> countof(T const (&)[N]) noexcept
{
return {};
}
#define COUNTOF(...) decltype(countof(__VA_ARGS__))::value
The change I’ve made to pfultz2’s version is to use ::value
rather than {}
after decltype
in the macro.
This makes the type of the result std::size_t
not std::integral_constant
, so it can be used in va_arg settings without triggering compiler or static analysis warnings.
It also has the advantage of not triggering extra warnings in VS2015U1 (this issue).