Bonjour.

Dans son tutoriel sur la métaprogrammation, Laurent Gomila propose l'implémentation de la factorielle suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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é ?