4

我意识到这是一个人为的例子,但我想要一个编译检查来防止这种情况......

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))
};
4

3 回答 3

4

以下应该有效:

BOOST_STATIC_ASSERT(((A*)(D*)0 == 0)) 

如果 A 存在两次,这应该会引发歧义错误,否则测试将始终成功(因为它比较两个空指针)。

于 2012-01-13T16:13:41.987 回答
0

当我尝试像您在这里两次派生一个类时,它甚至无法编译。(重复的基本类型)

于 2012-01-13T13:56:54.540 回答
0

如果你真的想要,你可以测试你的两个基类:

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
};
于 2012-01-13T17:14:11.453 回答