是否有标准名称(模板或宏)来替换ARRAY_SIZE,_countof等?

Voi*_*tar 8 c++ arrays

我不是在说std::array什么,只是经典的香草C/C++数组.我知道各种方式ARRAY_SIZE/ _countof可以实现,我只是想知道他们是否已经设法为此标准化了一个名称(在std::我假设下).如果没有,是否有提案?

Fil*_*efp 9

目前的解决方法

std :: extent - 数组的大小

如果您正在使用本机数组,则可以使用std::extentfrom <type_traits>,它用于生成数组第N维中的元素数(默认为第一个).

int a1[1024];
int a2[std::extent<decltype(a1)>::value]; // int[1024]
Run Code Online (Sandbox Code Playgroud)

一点间接(通用解决方案,而不仅仅是数组)

没有一个名称可以替代你所描述的内容,但是因为C++ 11可以使用std::beginstd::end获得适合实体的迭代器,并且与std::distance你一起有一个"极好"的方式获得具有合适品质的东西的大小.

int a1[1024];
auto n = std::distance (std::begin (a1), std::end (a1)); // 1024
Run Code Online (Sandbox Code Playgroud)


上述解决方案的缺点是三个函数都不是c ++ 11 中的constexpr,即使在C++ 14 std::distance中仍然不是constexpr(另外两个是).

这意味着该解决方案不能用于需要常量表达的上下文中.

如果你确实使用,提供了一个实体的工作RandomAccessIterators,一个解决方法解决方法是使用std::end (e) - std::begin(e)如果一个常数表达式需要(C++ 14).



展望未来

N4280建议我们添加std::size到标准库中,实际上正是您正在寻找的.

int a1[1024];
auto n = std::size (a1);
Run Code Online (Sandbox Code Playgroud)

如果一切按计划进行,我们将在C++ 17中使用它.