[Metaprog] Bloquer la compilation quand un paramètre de template est trop grand
Bonjour.
Dans son tutoriel sur la métaprogrammation, Laurent Gomila propose l'implémentation de la factorielle suivante :
Code:
1 2 3 4 5 6 7 8
| template<unsigned int N> struct Factorielle
{
enum {Value = N * Factorielle<N - 1>::Value};
};
template<> struct Factorielle<0>
{
enum {Value = 1};
}; |
Je me demandais comment bloquer la compilation "message d'erreur" quand N est supérieur à 11 (car 12! dépasse 2^32)
Merci
EDIT :
J'en profite pour glisser une autre question. L'implémentation de la puissance entière est la suivante :
Code:
1 2 3 4 5 6 7 8
| template <int N> inline double Puissance(double x)
{
return x * Puissance<N - 1>(x);
}
template <> inline double Puissance<0>(double x)
{
return 1.0;
} |
Pour travailler avec tous les types de données est-ce que l'implémentation suivante fonctionnerai :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template <int N, class T> inline T Puissance(T x)
{
return x * Puissance<N - 1>(x);
}
template <> inline T Puissance<0>(T x)
{
return (T)(1);
}
int main ()
{
double a = 3.15;
double b;
a = Puissance<10>(b);
} |
C'est à dire où dans l'utilisation que je fais de Puissance, le "class T" est détecté automatiquement et je n'ai pas à le spécifié ?