在编译时获取std::数组中的元素数量
Getting the number of elements in std::array at compile time
以下是一个有效的c++代码,为什么不是?
std::array<std::string, 42> a1;
std::array<int, a1.size()> a2;
它不能在GCC 4.8(在c++ 11模式下)编译。有一个简单但不优雅的解决方法:
std::array<std::string, 42> a1;
std::array<int, sizeof(a1)/sizeof(a1[0])> a2;
显然编译器可以算出std::array中的元素个数。为什么std::array::size()不是constexpr static
函数?
编辑:我找到了另一个解决方法:
std::array<std::string, 42> a1;
std::array<int, std::tuple_size<decltype(a1)>::value> a2;
array<T>::size()
是constexpr
,但您不能这样使用它,因为a1
不是constexpr
值。另外,它不能是constexpr
,因为string
不是文字类型。
但是,如果您愿意,可以通过推导size_t
模板参数来解决这个问题。例子:
#include <string>
#include <array>
#include <iostream>
using namespace std;
template<typename>
struct array_size;
template<typename T, size_t N>
struct array_size<array<T,N> > {
static size_t const size = N;
};
array<string, 42> a1;
array<string, array_size<decltype(a1)>::size> a2;
int main() {
cout << a2.size() << endl;
}
std::array::size
实际上被要求为constexpr
,根据c++ 11标准的§23.3.2.1:
23.3.2.4 array::size [array.size]
template <class T, size_t N> constexpr size_type array<T,N>::size() noexcept;
Returns: N
我猜这只是在GCC中实现它的人漏掉了。
经过测试,可以正常工作:
std::array<int, 42> a1;
std::array<int, a1.size()> a2;
这实际上可能与std::string
不是有效的constexpr
类型有关,而int
是编译时实例。
您可以使用与c++ 98数组绑定检测相同的模板推理方法。
template<size_t N, typename T>
constant_integer<N> array_size( const std::array<T, N>& );
- 演示:http://ideone.com/R4k1vG
制作一个漂亮的宏包装器并享受吧!
也可以有许多变体,例如:
- http://ideone.com/Hn46ei
它不是静态的,但它是一个constexpr
http://www.cplusplus.com/reference/array/array/size/
编辑:这可能不是一个错误,看看这个错误使用constexpr作为模板参数在同一个类
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀