如果类型T派生自类型X,如何允许模板类实例化?

时间:2014-04-06 11:59:43

标签: c++

template <typename T>
class Test
{
};

class A : public X;

class B;

Test<A> a; // OK
Test<B> b; // NOT OK

我想完成这样的事情。

也许这可以更轻松地完成。基本上,我需要的是:模板类T应该能够在类型为T的对象中锁定std :: mutex成员m_mutex。

2 个答案:

答案 0 :(得分:7)

使用静态断言和相应的type trait class

#include <type_traits>

template <typename T>
class Test
{
    static_assert( std::is_base_of<X,T>::value, "T doesn't derive from X!"); 
};

Live example

答案 1 :(得分:3)

您可以使用std::is_base_of<>进行SFINAE检查:

template<
    typename T,
    typename = typename std::enable_if<std::is_base_of<X, T>::value>::type
>
class Test {
   ...
};