Différentes façons de remplacer un if else avec les templates
Edit: ma question ne reflétait pas le vrai problème qui est : Quels sont les différentes manières de remplacer :
Code:
1 2 3 4 5
| if (condition qui peut être calculé statiquement) {
foo();
} else {
bar();
} |
par un code dont le branchement est calculé à la compilation.
Message initial :
Salut,
je m'initie à la programmation générique et j'aimerais simplement afficher le min et le max d'un type.
Je dois faire une spécialisation pour les char pour que la valeur affichée soit en int.
J'ai essayé de faire ceci :
Code:
1 2 3 4 5 6
|
template <class T>
void print_min_max()
{
do_print_min_max<T, sizeof(T) == 1>();
} |
mais je ne suis pas arrivé pas à écrire la fonction do_print_min_max.
J'ai donc essayé autrement et je suis arrivé au code correct suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| template <class T, bool need_cast>
struct cast;
template <class T>
struct cast<T, true>
{
typedef int type;
};
template <class T>
struct cast<T, false>
{
typedef T type;
};
template <class T>
struct cast_helper
{
typedef typename cast<T, sizeof(T) == 1>::type type;
};
template <class T>
void print_min_max()
{
typedef typename cast_helper<T>::type type;
std::cout << typeid(T).name() << " : min = "
<< static_cast<type>(std::numeric_limits<T>::min())
<< ", max = "
<< static_cast<type>(std::numeric_limits<T>::max())
<< std::endl;
} |
Par contre, est-ce qu'il possible de simplifier ce code en utilisant boost traits ou mpl ?
En outre, je serais très intéressé de savoir s'il est possible d'écrire la fonction (ou peut-être une classe) do_print_min_max.
Merci.
Différentes façons de remplacer un if else avec les templates
Citation:
Envoyé par
Sylvain Togni
Code:
1 2 3 4 5 6 7 8
| template <class T>
void print_min_max()
{
if (sizeof(T) == 1)
do_print_min_max<T, int>();
else
do_print_min_max<T, T>();
} |
Oui c'est possible, mais c'est dynamique.
Donc en fait j'aimerais savoir qu'elles sont les différentes manières de remplacer :
Code:
1 2 3 4 5
| if (condition qui est calculé statiquement) {
foo();
} else {
bar();
} |
par un code évaluer à la compilation.
Le code que j'ai écrit dans mon 1er message est une manière.
Je peux également faire :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
template <class T, bool needCast>
struct do_print_min_max;
template <class T>
struct do_print_min_max<T, true>
{
void operator()()
{
std::cout << "min = "
<< static_cast<int>(std::numeric_limits<T>::min())
<< ", max = "
<< static_cast<int>(std::numeric_limits<T>::max())
<< std::endl;
}
};
template <class T>
struct do_print_min_max<T, false>
{
void operator()()
{
std::cout << "min = "
<< std::numeric_limits<T>::min()
<< ", max = "
<< std::numeric_limits<T>::max()
<< std::endl;
}
};
template <class T>
void print_size_of_2()
{
do_print<T, sizeof(T) == 1>();
} |
Je préfère la première méthode (cf premier message) qui permet moins de duplication de code.
Si vous avez d'autres manières de faire je suis preneur.