codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
// // 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 :) }
Private
[
?
]
Run code
Submit