C ++ 11: Массив времени компиляции с глубиной логарифмической оценки

Один из способов реализации массива C ++ 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, а не линейной? (и, следовательно, позволит избежать предела глубины по умолчанию)

Ответы на вопрос(3)

Ваш ответ на вопрос