Edit: ma question ne reflétait pas le vrai problème qui est : Quels sont les différentes manières de remplacer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.