这一直困扰着我几个小时,我不明白如何使它工作。我只是想在每次使用规则时做一些事情,在这个例子中增加一个计数器。如果我没有明确指定规则,而是在调用 boost::spirit::karma::generate 时使用它,它就可以工作。但是当我尝试将所有内容都放入规则中时,它不会编译,并且我没有从冗长的错误消息中获得任何见解。
#include <iostream>
#include <string>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
int main()
{
using boost::spirit::karma::eps;
using boost::spirit::karma::int_;
using boost::spirit::karma::lit;
using boost::spirit::karma::eol;
using boost::phoenix::val;
using boost::phoenix::ref;
using boost::spirit::karma::generate;
using boost::spirit::karma::rule;
typedef std::back_insert_iterator<std::string> OutputIteratorType;
std::string s;
std::back_insert_iterator<std::string> sink(s);
int lineNum = 0;
generate(sink, eps[ref(lineNum) += 10] << lit("Line number ") << lit(lineNum) << lit(": ") << int_ << eol, 123);
generate(sink, eps[ref(lineNum) += 10] << lit("Line number ") << lit(lineNum) << lit(": ") << int_ << eol, 123);
// Will not compile
//rule<OutputIteratorType, int()> testRule = eps[ref(lineNum) += 10] << lit("Line number ") << lit(lineNum) << lit(": ") << int_ << eol;
//generate(sink, testRule, 123);
//generate(sink, testRule, 123);
std::cout << s;
return 0;
}
(上面你可以看到最优雅的 boost::spirit 版本,但是使用 lambda 函数或成员函数都会产生相同的结果,“直接方法”有效,“规则方法”无效。)
不幸的是,我也找不到任何涵盖此内容的文档或示例或其他资源,我也非常感谢您提供参考。