我意识到这是一个人为的例子,但我想要一个编译检查来防止这种情况......
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C
{
BOOST_STATIC_ASSERT((is_base_of_once<A,D>::value))
};
我意识到这是一个人为的例子,但我想要一个编译检查来防止这种情况......
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C
{
BOOST_STATIC_ASSERT((is_base_of_once<A,D>::value))
};
以下应该有效:
BOOST_STATIC_ASSERT(((A*)(D*)0 == 0))
如果 A 存在两次,这应该会引发歧义错误,否则测试将始终成功(因为它比较两个空指针)。
当我尝试像您在这里两次派生一个类时,它甚至无法编译。(重复的基本类型)
如果你真的想要,你可以测试你的两个基类:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C
{
static_assert(!(is_base_of<A,B>::value && is_base_of<A,C>::value),
"Invalid inheritance!");
};
否则,您可以使类虚拟地从 A 继承,这样派生类中仍然只有一个它的实例:
class A {};
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C
{
// only one A here
};