You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Boost.Parser中向解析器传递参数?

如何在Boost.Parser中向解析器传递参数?

我太懂这种转新库的迷茫了!刚从Boost.Spirit.Qi转用Boost.Parser的时候,我也纠结过怎么传递符号表这类参数——毕竟Qi里靠带成员的grammar就能轻松搞定,但Boost.Parser取消了grammar,规则还得写在全局作用域,确实有点不适应。

先给你揪出你代码里的核心问题:你的规则模板参数没声明要接收参数!你定义的toprule只指定了返回类型double,但没告诉它需要接收一个bp::symbols<double> const &类型的参数,所以编译肯定会报错。

下面是修正后的完整代码,我会一步步给你解释:

#include <boost/parser/parser.hpp>
namespace bp = ::boost::parser;

// 调整rule的模板参数,第三个模板参数指定规则要接收的参数类型(这里是const引用的symbols<double>)
bp::rule<struct toprule, double, bp::symbols<double> const &> toprule = "toprule";

// 这里用_bp<0>引用第一个传入的参数,和你原来的写法一致,现在参数类型匹配了
auto const toprule_def = bp::double_ >> bp::_p<0>;
BOOST_PARSER_DEFINE_RULES(toprule);

static void ParamTest(const bp::symbols<double> &syms)
{
    // 这里的with()传参写法是对的,现在规则能正确接收参数了
    auto result = bp::parse("10.3", toprule.with(syms), bp::ws);
}

关键的修改点:

  • 规则模板参数:在bp::rule的第三个模板参数位置,加上你要传递的参数类型bp::symbols<double> const &——Boost.Parser的规则模板参数顺序是:标签类型、返回值类型、参数类型列表(可以是多个,用逗号分隔)。
  • 参数引用:bp::_p<0>确实对应你传入的第一个参数,这个写法没问题,之前报错只是因为规则没声明要接收参数。

再帮你理清楚Boost.Parser的思路:它不需要像Qi那样把符号表存在grammar成员里,而是通过带参数的规则来实现外部数据的传递。你只需要在规则定义时声明好要接收的参数类型,然后在调用解析的时候用with()方法把参数传进去就行,完美替代了Qi里grammar成员的作用。

如果以后要传递多个参数,只需要在规则的模板参数里依次添加,比如bp::rule<struct my_rule, int, int, std::string const &>,然后用_p<0>、_p<1>分别引用第一个和第二个参数就行。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:19:36