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

标签 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++ 中,是否可以定义更惯用的东西?

最佳答案

使用 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::arrays 和 std::tuples:

template<class Array, std::size_t N = std::tuple_size<Array>::value>
constexpr std::size_t countof(Array&) { return N; }

参见 enriched program demo on coliru .

关于c++ - 如何在编译时获取数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454005/

相关文章:

c++ - 什么是 HTREEITEM?

c++11 - 如何使用 PostThreadMessage 使用 shared_ptr?

c++ - Qt5:如何修改下载速度以显示 1.xx MB/s 而不是 1.xxxxx MB/s?

java - 如何将字符串数组设置为等于另一个字符串(Java)(NB : I am using I/O)?

javascript - 在javascript中找到不同的匹配项和resort数组

javascript - 根据另一个数组值向数组添加项目

c++ - 用c++解决骑士之旅

c++ - 使用不同功能的队列中的打印元素不会在_start程序中全局清空队列。还有更多解释吗?

c++ - 继承只为代码重用c++

c++ - 如何通过 DeviceIoControl 功能使用 ATA 命令读取大磁盘(如 1 ,2 TB)?