既然我的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();
}
但似乎我无法将模板模板参数传递给mpl :: transform ...
我该如何解决这个问题?请提供C ++ 03解决方案,因为我不能使用C ++ 11。
答案 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;
在这种情况下,fun
是C<mpl::_1>
形式的一个类,其中C
是一个类模板,其::type
是std::vector<mpl::_1>
。我认为这是mpl::transform
对其类型映射的期望。
我唯一的测试是使用我自己的transform
版本,它使用模板模板参数而不是类型映射的占位符。检查live example,其中transform
是使用C ++ 11定义的,但其余部分是C ++ 03。在这个例子中,我只使用
wrap_into_container<container::vector>::template map
作为我的transform
的模板模板参数,没有占位符<mpl::_1>
。
我希望这会有所帮助。