为什么不将B子类与基类A相同?
我知道B是A而A不是B,但如果is_same在这些情况下没有返回true,那么我觉得它的使用是有限的。
在这种情况下是否存在可以返回true的std函数?
答案 0 :(得分:7)
由于is_same
检查相同类型,B
与A
的类型不同。你想要的是is_base_of
。这些也是元函数,而不是函数,更常被称为类型特征。
我们可以通过一个简单的程序验证这一点:
struct A {};
struct B : A {};
int main()
{
std::cout << std::boolalpha
<< std::is_same<A, A>::value << ' ' // true
<< std::is_same<A, const A>::value << ' ' // false!
<< std::is_same<A, B>::value << ' ' // false
<< std::is_base_of<A, B>::value << ' ' // true
<< std::is_base_of<B, A>::value << ' ' // false
<< std::is_base_of<A, A>::value << ' ' // true!
<< std::endl;
}
正如TC在评论中指出的那样,is_base_of
也会考虑不可访问/模糊的基础,所以也许您可能还想考虑is_convertible
,而不是。{3}}。例如:
struct B { };
struct D : private B { };
int main()
{
std::cout << std::boolalpha
<< std::is_base_of<B, D>::value << ' ' // true
<< std::is_convertible<D*, B*>::value // false, because private
// inheritance
<< std::endl;
}