Ho un'interfaccia oggetto e una raccolta di interfacce aperte che un oggetto derivato potrebbe voler supportare.Eredità multipla di interfacce in 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
}
Alcuni oggetti derivati potrebbero apparire così:
class Object1 : public IObject, public IMutable, public ILockable {}
class Object2 : public IObject, public ILockable, public ICertifiable {}
class Object3 : public IObject {}
Ecco la mia domanda: C'è un modo per scrivere funzioni che vorranno solo alcune combinazioni di queste interfacce? Ad esempio:
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.
La cosa più vicina che ho trovato è boost :: mpl :: inherit. Ho avuto un successo limitato ma non fa esattamente quello di cui ho bisogno.
Ad esempio:
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.
penso che qualcosa di simile a boost :: :: MPL ereditano ma che avrebbe generato un albero di eredità con tutte le possibili permutazioni del tipo in dotazione potrebbero funzionare.
Sono anche curioso di altri approcci per risolvere questo problema. Idealmente qualcosa che compila i controlli del tempo rispetto al runtime (cioè nessun dynamic_cast).
Intendi combinazioni AND, o combinazioni OR? –
Correggetemi se ho torto, ma le vostre funzioni astratte non devono essere contrassegnate come 'virtuali' ed essere' = 0'? – ApproachingDarknessFish
I take it use templates invece è la risposta sbagliata? –