Один из способов реализации массива С++ 11, который имеет свои элементы, инициализированные функцией их индекса, рассчитанные компилятором, и результаты, хранящиеся в разделе данных (.rodata) изображения приложения, - это использование шаблонов, частичная специализация и 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, а не линейной? (и, следовательно, позволит избежать предела глубины по умолчанию)