C++中接口的多重继承

ked*_*ede 7 c++ inheritance interface multiple-inheritance boost-mpl

我有一个对象接口和一个派生对象可能想要支持的开放式接口集合.

// 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
}
Run Code Online (Sandbox Code Playgroud)

某些派生对象可能如下所示:

class Object1 : public IObject, public IMutable, public ILockable {}
class Object2 : public IObject, public ILockable, public ICertifiable {}
class Object3 : public IObject {}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:有没有办法编写只接受这些接口的某些组合的函数?例如:

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.
Run Code Online (Sandbox Code Playgroud)

我发现最接近的是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.
Run Code Online (Sandbox Code Playgroud)

我认为类似于boost :: mpl :: inherit但会生成一个继承树,其中包含所提供类型的所有可能排列可能有效.

我也对解决这个问题的其他方法感到好奇.理想情况下,编译时间检查而不是运行时(即没有dynamic_cast).

Ste*_*and 1

也许这不是最优雅的方式,因为它是用 C++03 语法完成的

template <typename T, typename TInterface>
void interface_checker(T& t)
{
    TInterface& tIfClassImplementsInterface = static_cast<TInterface&>(t);
}
Run Code Online (Sandbox Code Playgroud)

这是给你技巧的精神。现在就你的情况而言:

template <typename T, typename TInterface1, typename TInterface2, typename TInterface3 >
void magic_interface_combiner(T& t)
{
    TInterface1& tIfClassImplementsInterface = static_cast<TInterface1&>(t);
    TInterface2& tIfClassImplementsInterface = static_cast<TInterface2&>(t);
    TInterface3& tIfClassImplementsInterface = static_cast<TInterface3&>(t);
}
Run Code Online (Sandbox Code Playgroud)

我想使用 C++11 类型特征可以更聪明地完成。