【问题标题】:mpl::transform on boost::fusion::tuplempl::transform on boost::fusion::tuple
【发布时间】:2011-06-21 16:00:23
【问题描述】:

以下代码无法在 g++ (GCC) 4.6.0 20110603 (prerelease)-std=c++0xBoost 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 会清除序列。据我所知,转换只需要 ForwardSequencetupleS 符合这一点。 transform 曾经需要 ExtensibleSequence,也许该位是从旧版本继承的。不过,我对此表示高度怀疑。

标签: c++ boost boost-mpl boost-fusion


【解决方案1】:

当您不提供插入器时,transform 必须为您生成一个(结果必须在某处 累积),这实质上相当于执行back_inserter&lt; clear&lt;OriginalSequence&gt;::type &gt; 之类的操作。 transform 文档在这里有些误导,因为它们没有记录对算法的“无插入器”版本的额外要求。

【讨论】:

    【解决方案2】:

    如果您使用 fusion::make_vector 而不是 make_tuple,则可以使用 mpl::transform。关键的技巧是#include &lt;boost/fusion/include/transform.hpp&gt;!一个简单的例子如下:

    #include <boost/fusion/include/transform.hpp>
    #include <boost/fusion/container/vector.hpp>
    #include <boost/mpl/transform.hpp>
    
    // Only works if <boost/fusion/include/transform.hpp> is included:
    typedef boost::fusion::vector<int> FusionVector;
    typedef typename boost::mpl::transform<FusionVector, boost::mpl::_1>::type FusionTransformed;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多