使用Boost Fusion显示平坦的Phoenix表达式

时间:2013-03-03 22:13:12

标签: c++ boost boost-fusion boost-phoenix boost-proto

按照Proto用户指南的Expressions as Fusion Sequences部分,我到了迭代展开的proto表达式的地步:_1 + 2 + 3 + 4

#include <iostream>
#include <boost/phoenix.hpp>

namespace proto   = boost::proto;
namespace fusion  = boost::fusion;
namespace phoenix = boost::phoenix;

struct display
{
  template<typename T>
  void operator()(T const &t) const
  {
    std::cout << t << std::endl;
  }
};

boost::proto::terminal<int>::type const _1 = {1};

int main(int argc, char *argv[])
{
  fusion::for_each(
    fusion::transform(
      proto::flatten(_1 + 2 + 3 + 4)
    , proto::functional::value()
    )
  , display()
  );
  return 0;
}

使用_1定义proto::terminal占位符,如上所示。我也想用 提升凤凰;但是,如果我在调用_1时使用boost::phoenix::arg_names中定义的fusion::for_each版本,则会出现错误:无法绑定'std :: ostream {aka std: :basic_ostream}'左值''std :: basic_ostream&amp;&amp;'。我可以使用Fusion变换使用这样的Phoenix占位符吗?

1 个答案:

答案 0 :(得分:3)

phoenix::arg_names::_1没有ostream插入器。不过,我们可以轻松添加一个。这用clang ++(trunk)为我编译:

#include <iostream>
#include <boost/phoenix.hpp>

namespace proto   = boost::proto;
namespace fusion  = boost::fusion;
namespace phoenix = boost::phoenix;

struct display
{
  template<typename T>
  void operator()(T const &t) const
  {
    std::cout << t << std::endl;
  }
};

namespace boost { namespace phoenix
{
  template<int N>
  std::ostream& operator<<(std::ostream& sout, argument<N> const& arg)
  {
    return sout << "_" << N;
  }
}}

int main()
{
  fusion::for_each(
    fusion::transform(
      proto::flatten(phoenix::arg_names::_1 + 2 + 3 + 4)
    , proto::functional::value()
    )
  , display()
  );
}