在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
相关产品推荐
相关产品推荐

