C ++ 11: Массив времени компиляции с глубиной логарифмической оценки
Один из способов реализации массива C ++ 11, элементы которого инициализируются функцией их индекса, рассчитанного компилятором, и результаты которого хранятся в разделе данных (.rodata) образа приложения, заключается в использовании шаблонов, частичной специализации и constexpr следующим образом:
#include
#include
using namespace std;
constexpr int N = 1000000;
constexpr int f(int x) { return x*2; }
typedef array A;
template constexpr A fs() { return A{{ f(i)... }}; }
template struct S;
template struct S
{ static constexpr A gs() { return fs(); } };
template struct S
{ static constexpr A gs() { return S::gs(); } };
constexpr auto X = S::gs();
int main()
{
cout < X[3] < endl;
}