3

我正在尝试使用 karma 从包含提供字符串的成员函数的结构向量生成逗号分隔的字符串列表。

虽然我可以使用 phoenix::bind 生成单个字符串输出,并且可以从字符串向量生成 csv 输出,但我正在努力结合这两种方法。

在下面的例子中,第一个规则工作正常,第二个不会编译(使用VS2013,boost 1.57),给出一个phoenix错误:“cannot convert from 'std::vector> *' to 'foo *'”,很清楚在这种情况下,适用于结构的单个实例的语义操作是不正确的。是使用融合适配器的唯一答案吗?

#include <iostream>
#include <vector>
#include <string>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;

struct foo 
{
  std::string f() const { return "bar"; }
};

int main()
{
  std::string output;
  typedef std::back_insert_iterator< std::string > iterator;
  iterator it(output);

  // this works:
  std::vector<std::string> svec = { "foo", "bar", "baz" };
  karma::rule< iterator, std::vector<std::string>() > svec_rule = karma::string % ',';
  karma::generate(it, svec_rule, svec);
  std::cerr << output << '\n';

  // but this won't compile
  std::vector<foo> vfoo(3);
  karma::rule< iterator, std::vector<foo>&() > vfoo_rule = karma::string[karma::_1 = phx::bind(&foo::f, karma::_val)] % ',';
  karma::generate(it, vfoo_rule, vfoo);
  std::cerr << output << '\n';
}
4

1 回答 1

1

_val代表该vector<foo>规则中的。你不能很好地调用foo::f向量。

foo相反,为(或使用)制定规则attr_cast<>

karma::rule<iterator, foo()> foo_rule = karma::string [ karma::_1 = phx::bind(&foo::f, karma::_val) ];
karma::generate(it, foo_rule % ',', vfoo);

std::cerr << output << '\n';

印刷bar,bar,bar

于 2015-02-09T15:35:41.730 回答