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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:56:05