C++ 使用成员函数从结构集合中提升精神业力生成

C++ 使用成员函数从结构集合中提升精神业力生成,c++,boost-phoenix,boost-spirit-karma,C++,Boost Phoenix,Boost Spirit Karma,我试图使用karma从包含提供字符串的成员函数的结构向量生成一个逗号分隔的字符串列表 虽然我可以使用phoenix::bind生成单个字符串输出,也可以从字符串向量生成csv输出,但我正在努力将这两种方法结合起来 在下面的示例中,第一个规则工作正常,第二个规则将无法编译(使用VS2013,boost 1.57),并给出一个phoenix错误:“无法从'std::vector>*'转换为'foo*”,因此在这种情况下,适用于结构的单个实例的语义操作显然是不正确的。使用fusion适配器的唯一答案是

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

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

在下面的示例中,第一个规则工作正常,第二个规则将无法编译(使用VS2013,boost 1.57),并给出一个phoenix错误:“无法从'std::vector>*'转换为'foo*”,因此在这种情况下,适用于结构的单个实例的语义操作显然是不正确的。使用fusion适配器的唯一答案是什么

#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';
}
#包括
#包括
#包括
#包括
#包括
名称空间业力=提升::精神::业力;
名称空间phx=boost::phoenix;
结构foo
{
std::string f()常量{return“bar”;}
};
int main()
{
std::字符串输出;
typedef std::back_insert_迭代器迭代器;
迭代器(输出);
//这项工作:
向量svec={“foo”,“bar”,“baz”};
karma::rulesvec_rule=karma::string%;
因果报应:生成(it、svec_规则、svec);

std::cerr
\u val
表示该规则中的
向量。在向量上不能很好地调用
foo::f

相反,为
foo
制定规则(或使用
attr\u cast
):

karma::rule foo_rule=karma::string[karma::_1=phx::bind(&foo::f,karma::_val)];
因果报应:生成(it,foo_rule%',',vfoo);

当然有了。非常感谢,这么简单的解决方案。
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';