2011-06-20 11 views
5

Chciałbym dziedziczyć z zestawu klas zawartych w boost mpl :: vector. czy to możliwe?meta-programowanie: dziedziczą z każdej klasy w boost :: mpl :: vector

W szczególności chcę przedłużyć test dla dowolnie wielu parametrów szablonu, przekazanych jako mpl :: vector.

template<class T> 
struct Slice 
{ 
public: 
    virtual void foo(T v) const = 0; 
}; 

struct A{}; 
struct B{}; 

template <class T1, class T2> 
struct test : public Slice<T1>, public Slice<T2> 
{ 
    void foo(T1 a) const {std::cout<<"A"<<std::endl;} 
    void foo(T2 b) const {std::cout<<"B"<<std::endl;} 
}; 

Jeśli wiem, że istnieją tylko dwa parametry to mogę po prostu napisać:

template <class mpl_vector_t > 
struct test : public Slice<typename mpl::at<mpl_vector_t,mpl::int_<0> >::type >, 
      public Slice<typename mpl::at<mpl_vector_t,mpl::int_<1> >::type > 
{ 
    typedef typename mpl::at<mpl_vector_t,mpl::int_<0> >::type T1; 
    typedef typename mpl::at<mpl_vector_t,mpl::int_<1> >::type T2; 

    void foo(T1 a) const {std::cout<<"A"<<std::endl;} 
    void foo(T2 b) const {std::cout<<"B"<<std::endl;} 
}; 

Czy jest możliwe, aby to zrobić dla dowolnego mpl :: vector?

Mój program testowy wygląda tak:

int 
main (int ac, char **av) 
{ 
    A a; 
    B b; 
    // test<A,B> t; //original 
    test<mpl::vector<A,B> > t; //mpl::vector with 2 elements 
    Slice<A>* Sa = &t; 
    Slice<B>* Sb = &t; 
    Sa->foo(a); 
    Sb->foo(b); 
} 
+1

interfejsu dziedziczenia, dziedziczenie pojedyncze, wielokrotne dziedziczenie, dziedziczenie _promiscuous_ :) Jeśli tylko projektanci ATL miał TMP/mpl : _) – sehe

+0

@sehe Nice, dodaję do mojego słownictwa "rozwiązłe dziedzictwo": P – AJG85

Odpowiedz

Powiązane problemy