У меня есть интерфейс объекта и открытый набор интерфейсов, которые, возможно, захочет поддерживать.Множественное наследование интерфейсов в 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.
Я думаю, что-то похожее на повышение :: MPL :: унаследуют но это будет генерировать дерево наследования со всеми возможными перестановками поставляемых типов могли бы работать.
Мне также интересны другие подходы к решению этой проблемы. В идеале, что-то, что компилирует проверку времени, в отличие от времени выполнения (т. Е. Нет dynamic_cast).
Вы имеете в виду AND-комбинации или OR-комбинации? –
Исправьте меня, если я ошибаюсь, но разве ваши абстрактные функции не должны быть помечены как 'virtual', а также' = 0'? – ApproachingDarknessFish
Я использую шаблоны вместо этого, это неправильный ответ? –