Utiliser les enable_if
de C++ 11 Je souhaite définir plusieurs implémentations spécialisées pour une fonction (basée sur le type du paramètre, disons) ainsi qu'une implémentation par défaut. Quelle est la bonne façon de le définir?Spécialisation de fonction de modèle partiel avec enable_if: implémenter l'implémentation par défaut
L'exemple suivant ne fonctionne pas comme prévu depuis l'appel de l'implémentation "générique", quel que soit le type T
.
#include <iostream>
template<typename T, typename Enable = void>
void dummy(T t)
{
std::cout << "Generic: " << t << std::endl;
}
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type>
void dummy(T t)
{
std::cout << "Integral: " << t << std::endl;
}
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type>
void dummy(T t)
{
std::cout << "Floating point: " << t << std::endl;
}
int main() {
dummy(5); // Print "Generic: 5"
dummy(5.); // Print "Generic: 5"
}
Une solution dans mon exemple minimal consiste à déclarer explicitement la mise en œuvre « générique » ne pas pour les types de points entiers ni flottantes, en utilisant
std::enable_if<!std::is_integral<T>::value && !std::is_floating_point<T>::value>::type
C'est exactement ce que je veux éviter, puisque dans mes cas d'utilisation réels il y a beaucoup d'implémentations spécialisées et je voudrais éviter une condition très longue (erreur sujette!) pour l'implémentation par défaut.
Une autre option consiste à mettre en application une classe fictive/struct et se spécialisent en partie que. Bien que cela implique probablement plus de dactylographie. – doublep
J'ai remarqué que l'on a vraiment besoin du second paramètre de template pour être un pointeur avec 'nullptr' par défaut pour que la construction fonctionne. Peux-tu m'expliquer pourquoi c'est le cas, ou m'indiquer une explication? Merci! – Bruno
@doublep plus de dactylographie est parfaitement acceptable si cela signifie que tout le monde peut lire et maintenir votre code. Cela en vaut vraiment la peine. –