//
// Interfaces grouping (with combinations) concept demonstration
//
// ------------------------------------------------
class IGroupEmpty {};
template<typename T1 = IGroupEmpty,
typename T2 = IGroupEmpty,
typename T3 = IGroupEmpty,
typename T4 = IGroupEmpty,
typename T5 = IGroupEmpty>
class IGroup;
template<typename T1>
class IGroup<T1>
: virtual public T1
{
};
template<typename T1,
typename T2>
class IGroup<T1,T2>
: virtual public IGroup<T1>
, virtual public IGroup<T2>
{
};
template<typename T1,
typename T2,
typename T3>
class IGroup<T1,T2,T3>
: virtual public IGroup<T1,T2>
, virtual public IGroup<T2,T1>
//
, virtual public IGroup<T1,T3>
, virtual public IGroup<T3,T1>
//
, virtual public IGroup<T2,T3>
, virtual public IGroup<T3,T2>
{
};
template<typename T1,
typename T2,
typename T3,
typename T4>
class IGroup<T1,T2,T3,T4>
: virtual public IGroup<T1,T2,T3>
, virtual public IGroup<T1,T3,T2>
, virtual public IGroup<T2,T1,T3>
, virtual public IGroup<T2,T3,T1>
, virtual public IGroup<T3,T1,T2>
, virtual public IGroup<T3,T2,T1>
//
, virtual public IGroup<T1,T2,T4>
, virtual public IGroup<T1,T4,T2>
, virtual public IGroup<T2,T1,T4>
, virtual public IGroup<T2,T4,T1>
, virtual public IGroup<T4,T1,T2>
, virtual public IGroup<T4,T2,T1>
//
, virtual public IGroup<T1,T3,T4>
, virtual public IGroup<T1,T4,T3>
, virtual public IGroup<T3,T1,T4>
, virtual public IGroup<T3,T4,T1>
, virtual public IGroup<T4,T1,T3>
, virtual public IGroup<T4,T3,T1>
//
, virtual public IGroup<T2,T3,T4>
, virtual public IGroup<T2,T4,T3>
, virtual public IGroup<T3,T2,T4>
, virtual public IGroup<T3,T4,T2>
, virtual public IGroup<T4,T2,T3>
, virtual public IGroup<T4,T3,T2>
{
};
// ------------------------------------------------
class InterfaceA
{
public:
virtual ~InterfaceA() {}
virtual void funcA1() = 0;
virtual void funcA2() = 0;
};
class InterfaceB
{
public:
virtual ~InterfaceB() {}
virtual void funcB1() = 0;
virtual void funcB2() = 0;
};
class InterfaceC
{
public:
virtual ~InterfaceC() {}
virtual void funcC1() = 0;
virtual void funcC2() = 0;
};
class InterfaceD
{
public:
virtual ~InterfaceD() {}
virtual void funcD1() = 0;
virtual void funcD2() = 0;
};
// ------------------------------------------------
class ConcreteChild : public IGroup<InterfaceA,InterfaceB,InterfaceC>
{
public:
virtual void funcA1() {}
virtual void funcA2() {}
virtual void funcB1() {}
virtual void funcB2() {}
virtual void funcC1() {}
virtual void funcC2() {}
};
// ------------------------------------------------
void funcA(IGroup<InterfaceA> * obj)
{
}
void funcAB(IGroup<InterfaceA,InterfaceB> * obj)
{
}
void funcBC(IGroup<InterfaceB,InterfaceC> * obj)
{
}
void funcBA(IGroup<InterfaceB,InterfaceA> * obj)
{
}
void funcCBA(IGroup<InterfaceC,InterfaceB,InterfaceA> * obj)
{
}
void funcAD(IGroup<InterfaceA,InterfaceD> * obj)
{
}
// ------------------------------------------------
int main(int argc, char * argv[])
{
typedef IGroup<InterfaceA,InterfaceB,InterfaceC> ConcreteChildType;
ConcreteChildType * child = new ConcreteChild();
funcA(child);
funcAB(child);
funcBC(child);
funcAD(child); // Compilation error :)
}