Restreindre le paramètre de modèle C ++ à la sous-classe

Comment puis-je forcer un paramètre de modèle T à être une sous-classe d’une classe spécifique Baseclass ? Quelque chose comme ça:

 template  void function(){ T *object = new T(); } 

Dans ce cas, vous pouvez faire:

 template  void function(){ Baseclass *object = new T(); } 

Cela ne comstackra pas si T n’est pas une sous-classe de Baseclass (ou T est la classe de base).

Avec un compilateur compatible C ++ 11, vous pouvez faire quelque chose comme ceci:

 template class MyClass { MyClass() { // Comstack-time sanity check static_assert(std::is_base_of::value, "Derived not derived from BaseClass"); // Do other construction related stuff... ... } } 

Je l’ai testé en utilisant le compilateur gcc 4.8.1 dans un environnement CYGWIN – il devrait donc également fonctionner dans des environnements * nix.

Pour exécuter du code moins inutile à l’exécution, vous pouvez consulter: http://www.stroustrup.com/bs_faq2.html#constraints qui fournit des classes qui effectuent efficacement le test de compilation et produisent des messages d’erreur plus intéressants.

En particulier:

 template struct Derived_from { static void constraints(T* p) { B* pb = p; } Derived_from() { void(*p)(T*) = constraints; } }; template void function() { Derived_from(); } 

Vous n’avez pas besoin de concepts, mais vous pouvez utiliser SFINAE:

 template  boost::enable_if< boost::is_base_of::value >::type function() { // This function will only be considered by the comstackr if // T actualy derived from Base } 

Notez que cela instanciera la fonction uniquement lorsque la condition est remplie, mais elle ne fournira pas une erreur sensible si la condition n’est pas remplie.

Vous pouvez utiliser BOOST_CONCEPT_REQUIRES Boost Concept Check :

 #include  #include  template  BOOST_CONCEPT_REQUIRES( ((boost::Convertible)), (void)) function() { //... } 

En appelant des fonctions à l’intérieur de votre modèle qui existent dans la classe de base.

Si vous essayez d’instancier votre modèle avec un type qui n’a pas access à cette fonction, vous recevrez une erreur de compilation.