コンパイラによって計算されたインデックスの関数によって要素が初期化され、結果がアプリケーションイメージのデータセクション(.rodata)に格納される、C ++ 11配列を実装する1つの方法は、テンプレート、部分特殊化、および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に関して対数になるようにする方法はありますか?(したがって、デフォルトの深度制限を回避します)