提升业力语义动作调用图
boost karma semantic action call map
我需要将值映射到 std::string(使用以下映射和 BOOST_FUSION_ADAPT_STRUCT)
std::map< TYPEX, std::string> author2name;
struct Emp
{
std::string name;
TYPEX author;
};
我想使用以下代码生成我的输出:
karma::rule< it, std::string()> quote = '"' >> karma::string >> '"';
karma::rule< it, Emp> emp = karma::delimit('\t')[ quite << quite[ author2name[ karma::_1] ]];
Emp x;
karma::generate( std::ostream_iterator<char>(std::cout), emp, x);
但是编译不了。
有什么方法可以让我像这样写 header:
karma::rule< it, std::vector<std::string>()> header = karma::delimit('\t')[ % quote];
karma::rule< it, Emp> emp = header >> karma::eol >> karma::delimit('\t')[ quite << quite[ author2name[ karma::_1] ]];
karma::generate( std::ostream_iterator<char>(std::cout), {"A", "B", "C"},emp, x);
那里有很多小paper-cuts害死你了:)
工作示例:
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <map>
namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;
enum TYPEX { AUTHOR1, AUTHOR2, AUTHOR3, AUTHOR4 };
std::map<TYPEX, std::string> author2name;
struct Emp {
std::string name;
TYPEX author;
};
BOOST_FUSION_ADAPT_STRUCT(Emp, name, author) // boost 1_59
//BOOST_FUSION_ADAPT_STRUCT(Emp, (std::string, name)(std::string, author)) // older boost
int main() {
using it = boost::spirit::ostream_iterator;
karma::rule<it, std::string()> quote;
karma::rule<it, TYPEX()> author;
karma::rule<it, Emp()> emp;
{
using namespace karma;
quote %= '"' << string << '"';
author = quote [ _1 = phx::ref(author2name)[ _val ] ];
emp %= delimit('\t')[ quote << author ];
}
Emp x { "one", AUTHOR2 };
author2name[AUTHOR2] = "TWO!";
std::cout << karma::format(emp, x);
}
打印:
"one" "TWO!"
惹事的事情:
- 建议使用
boost::spirit::ostream_iterator
和 karma::format
更多 user-friendly API
在 emp
上添加缺少的括号:
karma::rule<it, Emp()> emp;
NOTE: very recent boost (1_59 IIRC) doesn't not require these anymore. Which is why I found out only on Coliru
此处:
quote[ author2name[ karma::_1] ]
您使用 ... qi::_1
将 [] 索引到 std::map
中。那不能编译。您想要的是调用 operator[]
的 Phoenix 惰性表达式模板。您必须包括 Phoenix header 并强制 author2name
成为 Phoenix 参考演员:
quote [ _1 = phx::ref(author2name)[_1] ]
Note also, assigning back to _1
is important!
此外,要在存在语义操作的情况下使用 auto-rule,您需要使用 %=
(否则 Karma 将抑制所有自动属性传播)
我需要将值映射到 std::string(使用以下映射和 BOOST_FUSION_ADAPT_STRUCT)
std::map< TYPEX, std::string> author2name;
struct Emp
{
std::string name;
TYPEX author;
};
我想使用以下代码生成我的输出:
karma::rule< it, std::string()> quote = '"' >> karma::string >> '"';
karma::rule< it, Emp> emp = karma::delimit('\t')[ quite << quite[ author2name[ karma::_1] ]];
Emp x;
karma::generate( std::ostream_iterator<char>(std::cout), emp, x);
但是编译不了。
有什么方法可以让我像这样写 header:
karma::rule< it, std::vector<std::string>()> header = karma::delimit('\t')[ % quote];
karma::rule< it, Emp> emp = header >> karma::eol >> karma::delimit('\t')[ quite << quite[ author2name[ karma::_1] ]];
karma::generate( std::ostream_iterator<char>(std::cout), {"A", "B", "C"},emp, x);
那里有很多小paper-cuts害死你了:)
工作示例:
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <map>
namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;
enum TYPEX { AUTHOR1, AUTHOR2, AUTHOR3, AUTHOR4 };
std::map<TYPEX, std::string> author2name;
struct Emp {
std::string name;
TYPEX author;
};
BOOST_FUSION_ADAPT_STRUCT(Emp, name, author) // boost 1_59
//BOOST_FUSION_ADAPT_STRUCT(Emp, (std::string, name)(std::string, author)) // older boost
int main() {
using it = boost::spirit::ostream_iterator;
karma::rule<it, std::string()> quote;
karma::rule<it, TYPEX()> author;
karma::rule<it, Emp()> emp;
{
using namespace karma;
quote %= '"' << string << '"';
author = quote [ _1 = phx::ref(author2name)[ _val ] ];
emp %= delimit('\t')[ quote << author ];
}
Emp x { "one", AUTHOR2 };
author2name[AUTHOR2] = "TWO!";
std::cout << karma::format(emp, x);
}
打印:
"one" "TWO!"
惹事的事情:
- 建议使用
boost::spirit::ostream_iterator
和karma::format
更多 user-friendly API 在
emp
上添加缺少的括号:karma::rule<it, Emp()> emp;
NOTE: very recent boost (1_59 IIRC) doesn't not require these anymore. Which is why I found out only on Coliru
此处:
quote[ author2name[ karma::_1] ]
您使用 ...
qi::_1
将 [] 索引到std::map
中。那不能编译。您想要的是调用operator[]
的 Phoenix 惰性表达式模板。您必须包括 Phoenix header 并强制author2name
成为 Phoenix 参考演员:quote [ _1 = phx::ref(author2name)[_1] ]
Note also, assigning back to
_1
is important!此外,要在存在语义操作的情况下使用 auto-rule,您需要使用
%=
(否则 Karma 将抑制所有自动属性传播)