c ++模板:boost :: mpl :: transform with template template parameter

时间:2014-04-17 08:17:54

标签: c++ templates boost-mpl

既然我的previous question有了解决方案,就会出现更多问题。

我想在boost :: mpl :: transform中使用wrap_into_container元函数,例如:

#include <vector>
#include <list>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/mpl.hpp>
#include <boost/mpl/transform.hpp>

namespace container
{
    template <typename T> struct vector { typedef std::vector<T> type; };
    template <typename T> struct list   { typedef std::list<T> type; };
}

template<typename T, template <typename> class Container>
struct wrap_into_container
{
    typedef typename Container<T>::type type;
};

int main()
{
    namespace fusion = boost::fusion;
    namespace mpl = boost::mpl;

    typedef fusion::vector<int, float, int> vec_type;
    typedef mpl::transform< vec_type, wrap_into_container<mpl::_1, container::vector> >::type wrapped_vec_type;

    wrapped_vec_type w;
    return w.size();
}

Link to coliru

但似乎我无法将模板模板参数传递给mpl :: transform ...

我该如何解决这个问题?请提供C ++ 03解决方案,因为我不能使用C ++ 11。

2 个答案:

答案 0 :(得分:3)

boost::mpl中,通过传递具有内部apply模板成员(称为metafunction class)的固定类型而不是通过使用模板模板来编写更高阶函数参数。 Live Example

#include <vector>
#include <list>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/mpl.hpp>
#include <boost/mpl/transform.hpp>
#include <iostream>

namespace container
{
    struct vector {
        template<typename T> struct apply {
            typedef std::vector<T> type;
        };
    };
    struct list   {
        template <typename T> struct apply {
            typedef std::list<T> type;
        };
    };
}

template<typename T, typename ContainerMaker>
struct wrap_into_container
{
    typedef typename ContainerMaker::template apply<T>::type type;   
};

int main()
{
    namespace fusion = boost::fusion;
    namespace mpl = boost::mpl;

    typedef fusion::vector<int, float, int> vec_type;
    typedef mpl::transform<
        vec_type,
        wrap_into_container<mpl::_1, container::vector>
    >::type wrapped_vec_type;

    wrapped_vec_type w;
    std::cout << size(w) << "\n";
    return size(w);

}

答案 1 :(得分:1)

我不知道boost::mpl,所以我只能推测我在文档中看到的内容。

我认为你需要的是

template<template <typename> class Container>
struct wrap_into_container
{
    template<typename T>
    struct map
    {
        typedef typename Container<T>::type type;
    };
};

其次是

typedef wrap_into_container<container::vector>::template map<mpl::_1> fun;
typedef transform<vec_type, fun>::type wrapped_vec_type;

在这种情况下,funC<mpl::_1>形式的一个类,其中C是一个类模板,其::typestd::vector<mpl::_1>。我认为这是mpl::transform对其类型映射的期望。

我唯一的测试是使用我自己的transform版本,它使用模板模板参数而不是类型映射的占位符。检查live example,其中transform是使用C ++ 11定义的,但其余部分是C ++ 03。在这个例子中,我只使用

wrap_into_container<container::vector>::template map

作为我的transform的模板模板参数,没有占位符<mpl::_1>

我希望这会有所帮助。