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

时间:2015-03-16 04:26:29

标签: c++ arrays

我不是在谈论std::array或其他任何东西,只是经典的香草C / C ++数组。我了解ARRAY_SIZE / _countof可以实施的各种方式,我只是想知道他们是否设法为此标准化了一个名称({{{{{{{{{{{{{{{{{{ 1}}我假设)。如果不是有提案吗?

1 个答案:

答案 0 :(得分:9)

当前解决方法

std :: extent - 数组的大小

如果您使用的是原生数组,可以使用<type_traits>中的std::extentint a1[1024]; int a2[std::extent<decltype(a1)>::value]; // int[1024] 用于生成数组 Nth 维度中的元素数量(默认值)到第一个)。

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

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

没有一个名称可以替代您所描述的内容,但由于 C ++ 11 ,可以使用std::beginstd::end来为合适的实体获取迭代器,并与std::distance一起使用“极好”的方法来获得具有合适品质的东西。

std::distance


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

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

如果您确定使用的是提供 RandomAccessIterators 的实体,则解决方法的一种解决方法是使用std::size如果常量表达式是必需的( C ++ 14 )。



展望未来

N4280建议我们将int a1[1024]; auto n = std::size (a1); 添加到标准库中,实际上正是您所寻找的。

{{1}}

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