我意識到這是一個人爲的例子,但我想編譯檢查,以防止這種...有沒有辦法阻止一個類使用靜態斷言和類型特徵兩次派生?
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存在兩次,這應該漲多義性錯誤,而否則測試將始終成功(因爲它比較兩個空指針)。
當我嘗試派生類兩倍,你在這裏它甚至不進行編譯。 (一式兩份基本類型)
http://codepad.org/mXs97AHn – 2012-01-13 13:59:58
如果你真的想,你一個測試兩基類:
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
};
你的意思是'A'具有這個屬性,如果'A - > B'是確定的,但'A - >乙 - > C'是不是? (我寫'X - > Y'表示'X'是'Y'的基礎。) – 2012-01-13 13:56:18
你的意思是像'D1 - > B; D2→B; D3 - > D1,D2;'? – Xeo 2012-01-13 13:57:22
修改爲C++ – 2012-01-13 13:59:26