2011-06-20 29 views
5

我希望從包含在boost mpl :: vector中的一組類中繼承。這可能嗎?元編程:從boost中的每個類繼承mpl :: vector

具體而言,我希望擴展test任意多個模板參數,作爲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;} 
}; 

如果我知道只有兩個參數,那麼我可以簡單的寫:

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;} 
}; 

是可以對任意MPL ::矢量這樣做呢?

我的測試程序看起來像這樣:

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

接口繼承,單繼承,多重繼承,繼承_promiscuous_ :)如果只ATL的設計者不得不TMP/MPL :_) – sehe

+0

@sehe尼斯,我會在我的詞彙中添加「混雜的繼承」:P – AJG85

回答