Множественное наследование интерфейсов в 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 :: наследовать, но это будет генерировать дерево наследования со всеми возможными перестановками предоставленных типов может работать.
Мне также любопытно узнать о других подходах к решению этой проблемы. В идеале это то, что делает проверку времени компиляции, а не время выполнения (т.е. не динамический_каст).