2

boost::mpl::vector の各クラスのコンテナから継承したいクラスがあります。つまり、次のようなものです。

template <typename types_vector>
class A : inherit from std::vector<type> for each type in types_vector {

};

たとえば、次のベクトルがあるとします。

typedef boost::mpl::vector<bool, int, double> types_vector_;

その後、次A<types_vector_>のように展開されます。

class A : public std::vector<bool>, public std::vector<int>, public std::vector<double> {

};

C++11 機能を使用せずにこれを行うにはどうすればよいですか (残りのコードはまだ準備ができていません)。C++11以外の代替案があれば検討できますが、Boost MPLを使うのが良いと思います。

4

1 に答える 1

3

私はこのような何かがあなたを助けることができると思います。

#include <boost/mpl/vector.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/pop_front.hpp>
#include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/size.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/mpl/greater_equal.hpp>
#include <vector>
#include <iostream>

namespace mpl = boost::mpl;

template<typename T,
typename = void>
struct Some
{
   typedef std::vector<T> type;
};

template<typename T>
struct Some<T, 
typename boost::enable_if_c
   <
    mpl::and_
    <
     mpl::is_sequence<T>,
     mpl::greater_equal
     <
      mpl::size<T>, 
      mpl::int_<2>
     >
    >::type::value
   >::type> :
   public Some<typename mpl::front<T>::type>::type,
   public Some<typename mpl::pop_front<T>::type>
{
};

template<typename T>
struct Some<T,
typename boost::enable_if_c
   <
    mpl::and_
    <
     mpl::is_sequence<T>,
     mpl::equal_to
     <
      mpl::size<T>,
      mpl::int_<1>
     > 
    >::type::value
   >::type> :
public Some<typename mpl::front<T>::type>::type
{
};

template<typename T>
struct Some<T,
typename boost::enable_if_c
   <
    mpl::and_
    <
     mpl::is_sequence<T>,
     mpl::equal_to
     <
      mpl::size<T>,
      mpl::int_<0>
     >
    >::type::value
   >::type>
{
};


int main()
{
   typedef mpl::vector<int, double> vect_t;
   typedef Some<vect_t> vector;
   vector vect;
   vect.std::vector<int>::push_back(1);
   vect.std::vector<double>::push_back(2);
   std::cout << "int: " << vect.std::vector<int>::at(0) << std::endl;
   std::cout << "double: " << vect.std::vector<double>::at(0) << std::endl;
}

http://liveworkspace.org/code/ec56ebd25b821c9c48a456477f0d42c9

于 2012-08-26T18:09:27.280 に答える