实现 C++11 数组的一种方法是使用模板、部分特化和constexpr 如下:
#include <iostream>
#include <array>
using namespace std;
constexpr int N = 1000000;
constexpr int f(int x) { return x*2; }
typedef array<int, N> A;
template<int... i> constexpr A fs() { return A{{ f(i)... }}; }
template<int...> struct S;
template<int... i> struct S<0,i...>
{ static constexpr A gs() { return fs<0,i...>(); } };
template<int i, int... j> struct S<i,j...>
{ static constexpr A gs() { return S<i-1,i,j...>::gs(); } };
constexpr auto X = S<N-1>::gs();
int main()
{
cout << X[3] << endl;
}
这不适用于较大的 N 值:
error: constexpr evaluation depth exceeds maximum of 512
这是因为递归模板评估的头尾风格,它在 N 方面具有线性深度。
有没有办法做到这一点,使评估深度就 N 而言是对数的,而不是线性的?(因此会避免默认的深度限制)