我有一個對象接口和派生對象可能希望支持的開放式接口集合。C++中接口的多重繼承
// An object
class IObject
{
getAttribute() = 0
}
// A mutable object
class IMutable
{
setAttribute() = 0
}
// A lockable object
class ILockable
{
lock() = 0
}
// A certifiable object
class ICertifiable
{
setCertification() = 0
getCertification() = 0
}
一些派生的對象可能是這樣的:
class Object1 : public IObject, public IMutable, public ILockable {}
class Object2 : public IObject, public ILockable, public ICertifiable {}
class Object3 : public IObject {}
這裏是我的問題:有沒有寫功能,將只需要這些接口的某些組合的方式?例如:
void doSomething(magic_interface_combiner<IObject, IMutable, ILockable> object);
doSomething(Object1()) // OK, all interfaces are available.
doSomething(Object2()) // Compilation Failure, missing IMutable.
doSomething(Object3()) // Compilation Failure, missing IMutable and ILockable.
我發現的最接近的東西是boost :: mpl :: inherit。我有一些有限的成功,但它並不完全符合我的需要。
例如:
class Object1 : public boost::mpl::inherit<IObject, IMutable, ILockable>::type
class Object2 : public boost::mpl::inherit<IObject, ILockable, ICertifiable>::type
class Object3 : public IObject
void doSomething(boost::mpl::inherit<IObject, ILockable>::type object);
doSomething(Object1()) // Fails even though Object1 derives from IObject and ILockable.
doSomething(Object2()) // Fails even though Object2 derives from IObject and ILockable.
我認爲類似的boost :: MPL ::繼承的東西,但會產生與提供的類型的所有可能的排列組合可能會奏效繼承樹。
我也很好奇其他解決這個問題的方法。理想的情況是編譯時間檢查,而不是運行時(即沒有dynamic_cast)。
你的意思是AND組合,或OR組合? – 2013-02-21 17:00:29
糾正我,如果我錯了,但不是你的抽象函數需要被標記爲'虛擬'以及'= 0'? – ApproachingDarknessFish 2013-02-21 17:02:29
我拿它使用模板而不是錯誤的答案? – 2013-02-21 17:02:40