Supposons que nous ayons un code comme celui-ci. Cela fonctionne bien et pré-calcule les 5 premiers nombres de Fibonacci.calcul de l'heure de compilation avec métaprogrammation de gabarit
#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;
}
Cependant, il y a un "petit" problème. Et si nous avions besoin d'utiliser ceci pour des valeurs qui ne sont pas connues au moment de la compilation?
Pour quelques valeurs que nous pouvons faire:
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;
}
}
Cette volonté fonctionne bien pour 5 valeurs, mais si nous avons 150 ou 300?
Ce n'est pas vraiment grave de changer le code avec 300 lignes ...
Quelle pourrait être la solution ici?
Vous pourrait créer un tableau statique et rechercher dans l'exécution selon e. g. http://stackoverflow.com/questions/37297359/sequence-array-initialization-with-template – xcvii