是否有标准名称(模板或宏)来替换ARRAY_SIZE、_countof等
Is there a standard name (template or macro) to replace ARRAY_SIZE, _countof, etc yet?
我不是在谈论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::begin
和 std::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 年进行。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 如何用转义符替换字符串中的所有特殊字符
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在一个读写器队列中,我可以用volatile替换原子吗
- 用符号版本替换对函数的所有调用
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 替换基于地图的所有引用
- 按平均值替换数组中的元素
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- 初始化 std::vector 替换为单大括号而不是双大括号
- 使用 constexpr 和 std::array 进行静态初始化来替换动态初始化的 std::vector 的闰年
- 将 [] 替换为 std::array
- 如何查找和替换Eigen::Array对象中的所有非有限数
- 用std::array替换固定大小的数组