检查模板参数
问题描述:
我有一个模板类(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));
};
我知道必须有这样做的更打包式的方式。用这个。 – 2012-01-09 21:50:26