C++ 有没有办法防止使用静态断言和类型特征两次派生类?

C++ 有没有办法防止使用静态断言和类型特征两次派生类?,c++,multiple-inheritance,typetraits,static-assert,C++,Multiple Inheritance,Typetraits,Static Assert,我意识到这是一个人为的例子,但我想要一个编译检查,以防止这 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)) }; A类{}; B类:公共A{}; C类:公共A{}; D类:公共B、公共C { BOOST_STATIC_ASSERT((是_one

我意识到这是一个人为的例子,但我想要一个编译检查,以防止这

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))
};
A类{};
B类:公共A{};
C类:公共A{};
D类:公共B、公共C
{
BOOST_STATIC_ASSERT((是_one::value的_base_))
};

当我尝试两次派生一个类时,它甚至不会编译。(重复的基本类型)

以下操作应有效:

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->B
正常,但
A->B->C
不正常,您的意思是
A
具有此属性吗?(我写
X->Y
的意思是
X
Y
的基础)你的意思是
D1->B;D2->B;D3->D1,D2?所以你试图提出一种编译时机制来禁止菱形模式(在不使用虚拟继承时)。我想这是一个正确的评估。@LightnessRacesinOrbit:给这个家伙一些空间。如果你想疯狂编辑问题,我们每天都会有很多糟糕的问题。
class A {};
class B : public virtual A {};
class C : public virtual A {};

class D : public B, public C
{
    // only one A here
};