ExprTk带默认参数的random函数兼容旧用法问题求助
问题描述
此前已在ExprTk的symbol_table中添加无参random函数,代码如下:
exprtk::symbol_table<double> symbolTable; std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<double> dis(0.0, 1.0); auto randomFunc = []() { return dis(gen); }; symbolTable.add_function("random", randomFunc); exprtk::expression<double> expression; expression.register_symbol_table(symbolTable);
现将其修改为带min和max默认参数的版本,代码如下:
exprtk::symbol_table<double> symbolTable; std::random_device rd; std::mt19937 gen(rd()); auto randomFunc = [](double min = 0, double max = 1) { std::uniform_real_distribution<double> dis(min, max); return dis(gen); }; symbolTable.add_function("random", randomFunc); exprtk::expression<double> expression; expression.register_symbol_table(symbolTable);
该版本可正常运行,但无法兼容旧的无参调用方式(random或random())。推测ExprTk库仅检查参数数量,不识别函数的默认参数。请问是否必须改用ivararg_function来实现兼容,还是存在更简便的解决方法?
解决方案
无需改用ivararg_function,更简便的方案是为random注册多个重载版本:
ExprTk原生支持函数重载,你可以同时注册无参版本和带两个参数的版本,既能兼容旧的无参调用,又支持新的带参数调用逻辑,代码逻辑更清晰,也避免了可变参数的复杂处理。
示例代码如下:
exprtk::symbol_table<double> symbolTable; std::random_device rd; std::mt19937 gen(rd()); // 无参版本:兼容旧调用方式,返回0.0到1.0的随机数 auto random_no_arg = [&gen]() { std::uniform_real_distribution<double> dis(0.0, 1.0); return dis(gen); }; // 带参数版本:接收min和max,返回对应区间的随机数 auto random_with_range = [&gen](double min, double max) { std::uniform_real_distribution<double> dis(min, max); return dis(gen); }; // 注册两个重载函数到符号表 symbolTable.add_function("random", random_no_arg); symbolTable.add_function("random", random_with_range); exprtk::expression<double> expression; expression.register_symbol_table(symbolTable);
这样修改后,无论是无参调用random()/random,还是指定区间的调用random(2.0, 10.0)都能正常执行。
内容的提问来源于stack exchange,提问作者Destroy666
相关产品推荐
相关产品推荐

