Предположим, у нас есть такой код. Он хорошо работает и предварительно вычисляет первые 5 чисел Фибоначчи.вычисление времени компиляции данных с помощью шаблона метапрограммирования
#include <iostream>
template <int T>
struct fib;
template <>
struct fib<0>{
constexpr static int value = 1;
};
template <>
struct fib<1>{
constexpr static int value = 1;
};
template <int I>
struct fib{
constexpr static int value = fib<I - 1>::value + fib<I - 2>::value;
};
int main(){
std::cout << fib<0>::value << std::endl;
std::cout << fib<1>::value << std::endl;
std::cout << fib<2>::value << std::endl;
std::cout << fib<3>::value << std::endl;
std::cout << fib<4>::value << std::endl;
std::cout << fib<5>::value << std::endl;
}
Однако есть проблемы с "маленькой".
Что делать, если нам нужно использовать это для значений, которые неизвестны во время компиляции?
Для нескольких значений мы можем сделать это:
const int max = 5;
int getData(){
return 5; // return value between 0 and max.
}
int something(){
switch(getData()){
case 0: return fib<0>::value;
case 1: return fib<1>::value;
case 2: return fib<2>::value;
case 3: return fib<3>::value;
case 4: return fib<4>::value;
case 5: return fib<5>::value;
}
}
Это будет работать нормально для 5 значений, но что, если у нас есть 150 или 300?
На самом деле не очень важно изменить код на 300 строк ...
Что может быть обходным путем?
Вы может создавать статический массив и искать во время выполнения в соответствии с e. г. http://stackoverflow.com/questions/37297359/sequence-array-initialization-with-template – xcvii