在编译时获取std::数组中的元素数量

Getting the number of elements in std::array at compile time

本文关键字:元素 数组 获取 std 编译      更新时间:2023-10-16

以下是一个有效的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作为模板参数在同一个类