2012-01-13 32 views
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)) 
}; 
+0

你的意思是'A'具有這個屬性,如果'A - > B'是確定的,但'A - >乙 - > C'是不是? (我寫'X - > Y'表示'X'是'Y'的基礎。) – 2012-01-13 13:56:18

+0

你的意思是像'D1 - > B; D2→B; D3 - > D1,D2;'? – Xeo 2012-01-13 13:57:22

+0

修改爲C++ – 2012-01-13 13:59:26

回答

4

下面應該工作:

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

如果A存在兩次,這應該漲多義性錯誤,而否則測試將始終成功(因爲它比較兩個空指針)。

0

當我嘗試派生類兩倍,你在這裏它甚至不進行編譯。 (一式兩份基本類型)

+0

http://codepad.org/mXs97AHn – 2012-01-13 13:59:58

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 
}; 
相關問題