如何从mpl :: vector实例化模板?

时间:2015-08-31 20:52:27

标签: c++ templates boost template-meta-programming boost-mpl

如何转换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;

1 个答案:

答案 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没有的地方。