Jednym ze sposobów zaimplementowania tablicy C++ 11, której elementy zostały zainicjowane przez funkcję indeksu obliczoną przez kompilator i mają wyniki zapisane w sekcji danych (.rodata) obrazu aplikacji jest użycie szablonów, częściowej specjalizacji i constexpr następująco:C++ 11: Tablica czasu kompilacji z logarytmiczną głębokością oceny
#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;
}
ta nie działa w przypadku dużych wartości N:
error: constexpr evaluation depth exceeds maximum of 512
to dlatego, że z styl rekurencyjnej oceny szablonu, który ma liniową głębokość w te rms N.
Czy istnieje sposób, aby to zrobić, aby głębokość oceny była logarytmiczna pod względem N, a nie liniowa? (i tym samym uniknęłoby domyślnego limitu głębokości)
Powiązane: http://stackoverflow.com/questions/12108390/c11-compile-time-calculation-of-array –
Powiązane: http://stackoverflow.com/questions/13102996/c11-workaround-use-of -nie-niepełny-błąd-błędu –