检查模板参数

时间:2012-01-09 20:24:29

标签: c++ function templates

我有一个模板类(A)。如何检查类T是否来自抽象类IClass?

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

感谢

2 个答案:

答案 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提到这实际上是测试转换,而不是继承。可能有一种方法只能专门测试继承,如果那就是你需要的。