【发布时间】:2011-06-21 16:00:23
【问题描述】:
以下代码无法在 g++ (GCC) 4.6.0 20110603 (prerelease) 与 -std=c++0x 和 Boost 1.46.1 上编译。
我错过了包含还是这实际上是一个错误?如果是后者,如何解决?
#include <boost/mpl/vector.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/clear.hpp>
#include <boost/fusion/mpl.hpp>
#include <boost/fusion/include/clear.hpp>
#include <boost/fusion/include/clear.hpp>
#include <boost/fusion/adapted/boost_tuple.hpp>
#include <boost/fusion/include/boost_tuple.hpp>
namespace mpl = boost::mpl;
template<typename T>
struct Meta {
T t;
typedef mpl::vector<std::function<void(double)>, std::function<void(char)>,
std::function<void(int)>> MplVector;
typedef T FusionSequence;
//works
typedef mpl::transform< MplVector, mpl::identity<mpl::_1> >::type result;
//doesn't, work
typedef typename mpl::transform< FusionSequence, mpl::identity<mpl::_1> >::type result2;
};
template<typename T>
Meta<T> make_meta(T t) { return Meta<T>({t}); }
int main()
{
auto m = make_meta(boost::make_tuple(
std::function<void(double)>([](double) { }),
std::function<void(int)>([](int) { }),
std::function<void(char)>([](char) { })));
}
【问题讨论】:
-
看起来
transform必须实例化mpl::clear,这对于MplVector 成功但对于FusionSequence 失败,因为boost/fusion/mpl/detail/clear.hpp中只有list、map、set、vector 和deque 的清除?虽然不知道解决方法。 -
@Cubbi 我猜的很多,但不明白为什么 transform 会清除序列。据我所知,转换只需要
ForwardSequence和tupleS符合这一点。transform曾经需要ExtensibleSequence,也许该位是从旧版本继承的。不过,我对此表示高度怀疑。
标签: c++ boost boost-mpl boost-fusion