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.