将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实例化模板,则会收到编译时错误。