如何转换stl容器的矢量?
我有:
typedef boost::mpl::vector<std::vector<boost::mpl::_1>, std::deque<boost::mpl::_1> > Containers;
注意将其转换为:
typedef boost::mpl::vector<std::vector<int>, std::deque<int> > IntContainers;
如何做,应该使用什么&#34; xxx&#34; ?
typedef boost::mpl::transform
<
Containers,
boost::mpl::**xxx**<boost::mpl::_1 , int>
>::type IntContainers;
答案 0 :(得分:1)
transform
需要一个Lambda Expression的参数。最简单的lambda表达式是Metafunction Class,所以让我们继续。我们需要一个具有名为apply
的嵌套类模板的类,它产生一个名为type
的类型。在我们的例子中,apply
将采用一个本身就是lambda表达式的“参数”(在我们的示例中为vector<_1>
和<deque<_1>
),我们只需要apply
它。那就是:
template <typename Arg>
struct call_with {
template <typename T>
struct apply {
using type = typename boost::mpl::apply<T, Arg>::type;
};
};
using R = boost::mpl::transform<
Containers,
call_with<int>
>::type;
通过巧妙地使用占位符,可能可以在call_with
中编写所有transform
内联,但我发现这更容易理解。
编辑显然这里是占位符的巧妙使用:
using R = boost::mpl::transform<
Containers,
apply1<_1, int>
>::type;
我不明白为什么apply1
适用于apply
没有的地方。