2012-01-13 10 views
4

私は二回あなたがそれもコンパイルされません。ここに持っているようにクラスを派生しようとするとクラスが静的なアサートと型の特性を使用して2回派生するのを防ぐ方法はありますか?

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)) 
}; 
+0

'A - > B 'はOKですが、' A - > B - > C'はそうではないということを意味しますか? ( 'X - > Y'は' X'が 'Y'の基底であることを意味します) –

+0

' D1 - > Bのようなものですか? D2→B; D3→D1、D2; – Xeo

+0

実際にはC++に改訂されました –

答えて

4

:Aが二回存在する場合はそれ以外のテストは常に成功する一方で(それは2つのヌルポインタを比較しているため)

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

が、これは、曖昧エラーを上昇すべきです。

0

...私は、これは不自然な例で実現するが、私はこれを防ぐために、コンパイルのチェックをしたいです。以下は動作するはずです(重複基本型)

+0

http://codepad.org/mXs97AHn –

0

あなた本当には、あなたのベースクラスの両方のテストにしたい場合:そうでなければ、あなたはまだそれだけの1つのインスタンスが中にあるだろうように、クラスは、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!"); 
}; 

class A {}; 
class B : public virtual A {}; 
class C : public virtual A {}; 

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