考虑:
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,然后在该副本上应用转换,但这只是让我觉得我无法一次性完成这项工作。
答案 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;