Если вы не хотите, чтобы какая-либо из баз повторялась (и ни одна из баз не наследовала друг от друга), вы можете сделать это;
template <class FirstInterface, class... Interfaces>
class ObjectWithTemplate : public FirstInterface, public ObjectWithTemplate<Interfaces...>
{
public:
void foo()
{
FirstInterface::foo();
ObjectWithTemplate<Interfaces...>::foo();
};
};
// partial specialisation
template<class LastInterface>
class ObjectWithTemplate<LastInterface> : public LastInterface
{
public:
void foo()
{
LastInterface::foo();
};
};
Объект типа
ObjectWithTemplate<Interface1, Interface2> object;
на самом деле имеет Interface1
и ObjectWithTemplate<Interface2>
в качестве базовых классов.ObjectWithTemplate<Interface2>
, в свою очередь, имеет Interface2
в качестве базового класса.
Если вы повторяете базы или используете две базы, которые разделяют другую базу, например
ObjectWithTemplate<Interface1, Interface1> object;
ObjectWithTemplate<Interface1, SomethingDerivedFromInterface1> object2;
, тогда код будетне компилируется из-за двусмысленности.