[ create a new paste ] login | about

Link: http://codepad.org/ONI6uXjI    [ raw code | output | fork ]

k06a - C++, pasted on Jun 13:
//
// 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 :)
}


Output:
1
2
3
In function 'int main(int, char**)':
Line 170: error: cannot convert 'main(int, char**)::ConcreteChildType*' to 'IGroup<InterfaceA, InterfaceD, IGroupEmpty, IGroupEmpty, IGroupEmpty>*' for argument '1' to 'void funcAD(IGroup<InterfaceA, InterfaceD, IGroupEmpty, IGroupEmpty, IGroupEmpty>*)'
compilation terminated due to -Wfatal-errors.


Create a new paste based on this one


Comments: