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

Is there a standard name (template or macro) to replace ARRAY_SIZE, _countof, etc yet?

本文关键字:ARRAY 替换 SIZE countof 标准 是否      更新时间:2023-10-16

我不是在谈论std::array或任何东西,只是经典的香草C/C++数组。我知道可以实现ARRAY_SIZE/_countof的各种方式,我只是想知道他们是否已经设法为此标准化了一个名称(根据我假设std::)。如果没有,是否有建议?

当前的解决方法

std::extent - 数组的大小

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

int a1[1024];
int a2[std::extent<decltype(a1)>::value]; // int[1024]

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

没有一个名称可以替代您所描述的内容,但是从 C++11 开始,人们可以使用 std::beginstd::end 来获取合适实体的迭代器,并且与std::distance一起,您有一种"极好"的方式来获得具有合适品质的事物的大小。

int a1[1024];
auto n = std::distance (std::begin (a1), std::end (a1)); // 1024

上述解决方案的缺点是,这三个函数在 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);

如果一切按计划进行,我们将在 C++17 年进行。