如何在编译时获取数组大小?

时间:2018-03-23 16:11:37

标签: c++ arrays c++11

在定义C样式数组或C ++ 11数组时,通常需要获得编译时常量来表示此类数组的大小。在C中,宏用于执行此类操作而不依赖于可变长度数组(因为它在C99中不是标准的):

#define ARRAY_SIZE 1024
int some_array[ARRAY_SIZE];

#define countof(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))

在C ++中,是否可以定义更具惯用性的东西?

3 个答案:

答案 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

请参阅enriched program demo on coliru

答案 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