检查模板参数

问题描述:

我有一个模板类(A)。我如何检查T类是否从抽象类IClass派生?检查模板参数

template <class T> 
class A 
{ 
     //T have to be derived from abstract class IClass 
} ; 

感谢

你想要做的是为模板的概念检查引用。这些将成为C++ 11的一个功能,但标准委员会将其裁掉。

尽管如此,它仍然可以做到,但它并不像其他方式那样干净。 Bjarne的Stroustrup的解释如何做到这一点在他的FAQ:http://www2.research.att.com/~bs/bs_faq2.html#constraints

特别是他给出了下面的例子:

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> class A : Derived_from<T,IClass> { ... } 

Stroustrup提到,这实际上是测试转换,而不是继承。如果这是你需要的,可能只有专门测试继承的方法。

使用静态断言和升压,TR1或C++ 11 is_base_of

template <class T> 
class A { 
public: 
    BOOST_STATIC_ASSERT((boost::is_base_of<IClass, T>::value)); 
}; 
+0

我知道必须有这样做的更打包式的方式。用这个。 – 2012-01-09 21:50:26