これは不自然な例だと思いますが、これを防ぐためにコンパイルチェックが必要です...
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 が 2 回存在する場合、あいまいエラーが発生しますが、それ以外の場合、テストは常に成功します (2 つの null ポインターを比較するため)。
本当にしたい場合は、両方の基本クラスをテストします。
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 から継承されるようにして、派生クラスにそのインスタンスが 1 つだけ存在するようにすることができます。
class A {};
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C
{
// only one A here
};
ここにあるようにクラスを2回派生させようとすると、コンパイルさえしません。(ベースタイプの複製)