метапрограммирование: наследование от каждого класса в надстройке mpl :: vector - PullRequest
5 голосов
/ 20 июня 2011

Я хочу наследовать от набора классов, содержащихся в 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 :: vector?

Моя тестовая программа выглядит так:

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 Ответ

5 голосов
/ 20 июня 2011

Вы хотите использовать mpl :: inherit_linearly

...