将C ++模板参数限制为子类

我怎样才能强制模板参数T是一个特定的类Baseclass的子类? 像这样的东西:

 template <class T : Baseclass> void function(){ T *object = new T(); } 

在这种情况下你可以这样做:

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

如果T不是Base类的子类(或T Base类),则不会编译。

用C ++ 11兼容的编译器,你可以做这样的事情:

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

我已经在CYGWIN环境中使用gcc 4.8.1编译器testing过了,所以它也应该在* nix环境中工作。

要在运行时执行较less的无用代码,您可以查看http://www.stroustrup.com/bs_faq2.html#constraints ,它提供了一些可以高效地执行编译时testing的类,并生成更好的错误消息。

尤其是:

 template<class T, class B> struct Derived_from { static void constraints(T* p) { B* pb = p; } Derived_from() { void(*p)(T*) = constraints; } }; template<class T> void function() { Derived_from<T,Baseclass>(); } 

你不需要概念,但是你可以使用SFINAE:

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

请注意,只有满足条件时,才会实例化该函数,但如果条件不满足,则不会提供明智的错误。

您可以使用Boost Concept Check的BOOST_CONCEPT_REQUIRES

 #include <boost/concept_check.hpp> #include <boost/concept/requires.hpp> template <class T> BOOST_CONCEPT_REQUIRES( ((boost::Convertible<T, BaseClass>)), (void)) function() { //... } 

通过调用基类中存在的模板中的函数。

如果尝试使用无法访问此函数的types实例化模板,则会收到编译时错误。