提升MPL - 对joint_view进行转换

时间:2017-10-14 12:37:33

标签: c++ boost boost-mpl

考虑:

template<typename T>
struct MakeVectorOfType
{
    typedef std::vector<T> type;
};

typedef boost::mpl::vector<int, double> TScalarTypes;
typedef boost::mpl::transform<TScalarTypes, MakeVectorOfType<boost::mpl::placeholders::_1>>::type TVectorTypes;
typedef boost::mpl::joint_view<TScalarTypes, TVectorTypes>::type TTypes;

template<typename T>
struct Wrapper
{
    T value;
};

template<typename T>
struct MakeWrapper
{
    typedef Wrapper<T> type;
};

typedef boost::mpl::transform<
    TScalarTypes::type,
    MakeWrapper<boost::mpl::placeholders::_1>
>::type TScalarWrapperTypes; // <-- Works

typedef boost::mpl::transform<
    TTypes::type,
    MakeWrapper<boost::mpl::placeholders::_1>
>::type TAllWrapperTypes; // <-- Compiler error

基本上我在MPL序列中有一些类型,我用这些类型的std :: vectors创建另一个序列,然后我想用两者的并集做一些事情。如果我想对该联合做另一个转换(使用joint_view),我会得到以下编译器错误(使用MSVC2017):

1>e:\source\trunk\thirdparty\boost\mpl\clear.hpp(31): error C2504: 'boost::mpl::clear_impl<boost::mpl::aux::joint_view_tag>::apply<Sequence>': base class undefined
1>        with
1>        [
1>            Sequence=boost::mpl::joint_view<TScalarTypes,TVectorTypes>
1>        ]

(......加上更多追溯到上面的代码,很明显)

另一个(我直接在序列上进行变换)工作得很好,所以AFAICT它是在一个联合视图上应用变换的组合,这是问题。因此,因为联合视图不是真实的&#39;序列,但只是一个视图&#39;?我可以先复制一下joint_view,然后在该副本上应用转换,但这只是让我觉得我无法一次性完成这项工作。

1 个答案:

答案 0 :(得分:0)

似乎mtl :: transform无法处理joint_view生成的序列。 joint_view生成一个懒惰的前向序列&#39;哪个mtl :: transform可能不支持。

你可以使用boost :: mpl :: copy来解决问题,

typedef typename boost::mpl::copy<TVectorTypes, boost::mpl::back_inserter<TScalarTypes> >::type TTypes;