2011-06-20 47 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

回答