我有一个模板类(A)。如何检查类T是否来自抽象类IClass?
template <class T>
class A
{
//T have to be derived from abstract class IClass
} ;
感谢
答案 0 :(得分:4)
使用来自Boost,TR1或C ++ 11的静态断言和is_base_of
:
template <class T>
class A {
public:
BOOST_STATIC_ASSERT(( boost::is_base_of<IClass, T>::value ));
};
答案 1 :(得分:1)
您要做的事情被称为模板概念检查。这些将成为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提到这实际上是测试转换,而不是继承。可能有一种方法只能专门测试继承,如果那就是你需要的。