Modèles de fonction: différentes spécialisations avec des caractères de type

En considérant les modèles de classe, il est possible de fournir des spécialisations de modèles pour certains types de groupes à l’aide de caractères de type et de parameters de modèles factices. J’ai déjà demandé cela plus tôt .

Maintenant, j’ai besoin de la même chose pour les modèles de fonction: par exemple, j’ai une fonction de modèle et je veux une spécialisation pour un groupe de types, par exemple tous les types qui sont un sous-type d’une classe X Je peux exprimer cela avec des caractères typographiques comme ceci:

 std::enable_if<std::is_base_of::value>::type 

J’ai pensé le faire de cette façon:

 template  void foo(){ //Do something } template  void foo<T,std::enable_if<std::is_base_of::value>::type>(){ //Do something different } 

Toutefois, cela ne fonctionne pas car une spécialisation partielle n’est pas autorisée pour les modèles de fonction. Alors, comment le faire alors? Peut-être un paramètre par défaut avec le trait comme type? Mais à quoi ressemble le code alors?

Le plus proche de ce que vous demandez est enable_if sur le type de retour:

 template typename std::enable_if::value>::type foo(); template typename std::enable_if::value>::type foo(); 

Cependant, l’envoi d’une fonction ou d’une classe d’assistance sera probablement plus lisible et efficace.

Fonction d’assistance:

 template void foo_helper(std::true_type); template void foo_helper(std::false_type); template void foo() { foo_helper(std::is_same()); } 

Classe d’assistance:

 template::value> struct foo_helper {}; template struct foo_helper { static void foo(); }; template struct foo_helper { static void foo(); }; template void foo() { foo_helper::foo(); } 

Surcharges:

 void foo_impl(T, std::false_type); void foo_impl(T, std::true_type); foo(T t) { foo_impl(t, std::is_base_of()); } 

Effectuez l’implémentation réelle (spécialisations partielles, etc.) dans les modèles de classe et écrivez une petite fonction de modèle d’enveloppe qui ne fait qu’appeler une fonction statique dans vos modèles.

J’ai essayé plusieurs choses avant de trouver moi-même la syntaxe correcte – désolé de demander. Je ne savais pas que enable_if avait un deuxième paramètre. En utilisant ce paramètre et une valeur par défaut, c’est possible.

Voici la réponse

 template void foo(typename std::enable_if::value,int>::type ENABLER = 0){ std::cout << "T is a subclass of A!"; } template void foo(typename std::enable_if::value,int>::type ENABLER = 0){ std::cout << "T is NOT a subclass of A"; }