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

在ExprTk中绑定不可赋值变量并获取其最新值的方法

在ExprTk中实现只读可更新变量(类似C++ const)

ExprTk的add_constant方法会将变量值拷贝到符号表中,而非绑定变量引用,所以后续修改原变量不会影响表达式求值结果。要实现「禁止表达式赋值+求值时取变量最新值」的需求,需要用带只读标记的变量绑定,具体方案如下:

核心思路

使用symbol_table.add_variable绑定变量的引用,再通过变量的set_flags方法设置为只读(e_readonly):

  • 绑定引用确保每次求值都会读取变量的最新值
  • 只读标记会让编译器直接拒绝任何试图给该变量赋值的表达式

修改后的代码示例

using symbol_table_t = exprtk::symbol_table<float>;
using expression_t   = exprtk::expression<float>;
using parser_t       = exprtk::parser<float>;

float x = 1.0f;

symbol_table_t symbol_table;
// 绑定变量x的引用,而非拷贝值
auto& var = symbol_table.add_variable("x", x);
// 设置变量为只读,禁止表达式内赋值
var.set_flags(exprtk::variable::e_readonly);

expression_t expression;
expression.register_symbol_table(symbol_table);

parser_t parser;
std::string expression_string = "x + 3";

// 编译合法表达式
if (parser.compile(expression_string, expression)) {
    expression.value(); // 返回4,符合预期
    x = 3;
    expression.value(); // 返回6,取到x的最新值
}

// 尝试编译赋值表达式,会失败
if (!parser.compile("x := x/3+1", expression)) {
    // 进入此分支,编译器报错提示无法给只读变量赋值
}

关键说明

  • add_variable传入变量引用,原变量x的修改会实时反映到表达式求值中
  • e_readonly标记会触发ExprTk语法分析器的赋值检查,直接阻断非法表达式的编译
  • 该方案完全匹配「外部可修改变量、表达式内仅可读不可写」的const变量行为

内容的提问来源于stack exchange,提问作者NariPDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:25:03