Supposons que je veuille écrire une fonction générique void f<T>()
, ce qui ne fait qu'une chose si T
est un type POD et une autre chose si l' T
est non-POD (ou tout autre arbitraire prédicat).
Une façon d'y parvenir serait d'utiliser une balise d'expédition modèle comme la bibliothèque standard ne avec itérateur catégories:
template <bool> struct podness {};
typedef podness<true> pod_tag;
typedef podness<false> non_pod_tag;
template <typename T> void f2(T, pod_tag) { /* POD */ }
template <typename T> void f2(T, non_pod_tag) { /* non-POD */ }
template <typename T>
void f(T x)
{
// Dispatch to f2 based on tag.
f2(x, podness<std::is_pod<T>::value>());
}
Une alternative serait d'utiliser la fonction membre statique d'partiellement spécialisés types:
template <typename T, bool> struct f2;
template <typename T>
struct f2<T, true> { static void f(T) { /* POD */ } };
template <typename T>
struct f2<T, false> { static void f(T) { /* non-POD */ } };
template <typename T>
void f(T x)
{
// Select the correct partially specialised type.
f2<T, std::is_pod<T>::value>::f(x);
}
Quels sont les avantages et les inconvénients de l'utilisation d'une méthode plutôt que l'autre? Qui recommanderiez-vous?