Mam interfejs obiektowy i otwartą kolekcję interfejsów, które obiekt pochodny może obsługiwać.Wiele dziedziczenia interfejsów w 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
}
Niektóre obiekty pochodzące może wyglądać następująco:
class Object1 : public IObject, public IMutable, public ILockable {}
class Object2 : public IObject, public ILockable, public ICertifiable {}
class Object3 : public IObject {}
Oto moje pytanie: Czy istnieje sposób, aby napisać funkcje, które zajmie tylko niektóre kombinacje tych interfejsów? Na przykład:
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.
Najbliższą rzeczą jaką znalazłem to boost :: mpl :: inherit. Odniosłem pewien ograniczony sukces, ale nie robi dokładnie tego, czego potrzebuję.
Na przykład:
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.
myślę coś podobnego do boost :: mpl :: dziedziczą ale które generują drzewo dziedziczenia ze wszystkich możliwych permutacji dostarczanych typów może działać.
Jestem także ciekawy innych podejść do rozwiązania tego problemu. Idealnie coś, co wykonuje kontrole czasu kompilacji w przeciwieństwie do środowiska wykonawczego (tzn. Nie ma dynamicznego podglądu).
Masz na myśli kombinacje AND lub kombinacje OR? –
Popraw mnie, jeśli się mylę, ale czy twoje abstrakcyjne funkcje nie muszą być oznaczone jako "wirtualne", a także "= 0"? – ApproachingDarknessFish
Używam szablonów zamiast tego, czy jest to zła odpowiedź? –