检查template参数是否等于另一个模板参数的Base类

时间:2014-05-23 15:02:07

标签: c++ templates c++11

我有一个这样的课程:

template <class T1, class T2>
class A
{
    //Error if Base class of T2 is not T1 (At compile time)
};

我想检查T1是否为T2的基类。编译时有可能吗?

一些例子:

class C{};
class B :public C{};

A< C, B > a;     //Ok because C is base class of B
A<B, C> b;       //Error B is not base class of C
A<char, char> c; //Error char is not base class of char 
//.....

2 个答案:

答案 0 :(得分:7)

std::is_base_of会帮助你完成大部分工作,但这并不是你想要的。如果两种类型相同,您也希望出现错误,对于任何用户定义的类型is_base_of<T, T>::valuetrue始终为T。将检查与std::is_same结合使用可获得所需的行为。

template <class T1, class T2>
class A
{
    static_assert(std::is_base_of<T1, T2>::value &&
                  !std::is_same<T1, T2>::value,
                  "T1 must be a base class of T2");
};

这将产生以下结果:

A< C, B > a;     //Ok because C is base class of B
A<B, C> b;       //Error B is not base class of C
A<char, char> c; //Error char is not base class of char 
A<B, B> d;       //Error B is not base class of B <-- this won't fail without
                 //                                   the is_same check

答案 1 :(得分:4)

std::is_base_ofstd::enable_if

一起使用
template <
    class T1,
    class T2,
    class = typename std::enable_if<
        std::is_base_of<T1, T2>::value
    >::type
>
class A
{
};

您还可以使用static_assert获取自定义消息:

template <class T1, class T2>
class A
{
    static_assert(std::is_base_of<T1, T2>::value,
                  "T1 must be a base class of T2");
};