我有一个类,我想从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功能的情况下执行此操作(其余代码尚未准备好)?我认为使用boost MPL是可行的方法,虽然除了C ++ 11之外还有其他选择,我可以考虑一下。
答案 0 :(得分: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