我有一个这样的课程:
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
//.....
答案 0 :(得分:7)
std::is_base_of
会帮助你完成大部分工作,但这并不是你想要的。如果两种类型相同,您也希望出现错误,对于任何用户定义的类型is_base_of<T, T>::value
,true
始终为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_of
与std::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");
};