Множественное наследование интерфейсов в 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 object);

doSomething( Object1() )  // OK, all interfaces are available.
doSomething( Object2() )  // Compilation Failure, missing IMutable.
doSomething( Object3() )  // Compilation Failure, missing IMutable and ILockable.

Ближайшая вещь, которую ямы обнаружили, что это Boost :: MPL :: наследовать. Я'у нас был некоторый ограниченный успех, но это неделаю именно то, что мне нужно.

Например:

class Object1 : public boost::mpl::inherit::type
class Object2 : public boost::mpl::inherit::type
class Object3 : public IObject

void doSomething(boost::mpl::inherit::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 :: наследовать, но это будет генерировать дерево наследования со всеми возможными перестановками предоставленных типов может работать.

Мне также любопытно узнать о других подходах к решению этой проблемы. В идеале это то, что делает проверку времени компиляции, а не время выполнения (т.е. не динамический_каст).

Ответы на вопрос(5)

Ваш ответ на вопрос