使用成员函数从结构集合中提升精神业力的产生
boost spirit karma generation from a collection of struct using a member function
我正在尝试使用 karma 从包含提供字符串的成员函数的结构向量中生成逗号分隔的字符串列表。
虽然我可以使用 phoenix::bind 生成单个字符串输出,并且可以从字符串向量生成 csv 输出,但我很难将这两种方法结合起来。
在下面的示例中,第一个规则工作正常,第二个将无法编译(使用 VS2013,boost 1.57),给出凤凰错误:"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';
}
_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
我正在尝试使用 karma 从包含提供字符串的成员函数的结构向量中生成逗号分隔的字符串列表。
虽然我可以使用 phoenix::bind 生成单个字符串输出,并且可以从字符串向量生成 csv 输出,但我很难将这两种方法结合起来。
在下面的示例中,第一个规则工作正常,第二个将无法编译(使用 VS2013,boost 1.57),给出凤凰错误:"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';
}
_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