在定义C样式数组或C ++ 11数组时,通常需要获得编译时常量来表示此类数组的大小。在C中,宏用于执行此类操作而不依赖于可变长度数组(因为它在C99中不是标准的):
#define ARRAY_SIZE 1024
int some_array[ARRAY_SIZE];
或
#define countof(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))
在C ++中,是否可以定义更具惯用性的东西?
答案 0 :(得分:3)
使用C ++' constexpr
,可以找到数组的编译时常量大小:
template<std::size_t N, class T>
constexpr std::size_t countof(T(&)[N]) { return N; }
使用如下:
int some_array[1024];
static_assert(countof(some_array) == 1024, "wrong size");
struct {} another_array[1];
static_assert(countof(another_array) == 1, "wrong size");
请参阅full program demo on coliru。
如果想要交替使用std::array
和C风格的数组,则可以使用SFINAE添加countof
的定义std::array
和{{1} } S:
std::tuple
答案 1 :(得分:3)
如果您的标准库与C ++ 17兼容,请使用std::size(xyz)
。
如果您的标准库还没有提供,那么您自己很容易实现,the constexpr
-specifier is C++11。
答案 2 :(得分:1)
如果您不想引入自己的功能并仅使用STL执行此操作,则可以使用std::distance
检索大小:
#include <utility>
auto size = std::distance(std::begin(some_array), std::end(some_array));
自C ++ 17以来它是constexpr