C++如何实现handler函数支持任意数量任意类型参数传入并调用
实现方案
核心思路是利用std::bind/lambda的参数绑定能力,TestUnit侧不需要修改原有std::function<int(void)>的定义,只需要开放注册时的参数绑定入口,即可支持任意数量、任意类型参数的handler注册,且保证返回值统一为int。
具体修改步骤
- 第一步:修改
ADD_FUNCTION宏为可变参数版本,支持绑定任意数量的入参
// 替换原有宏定义,##__VA_ARGS__用于兼容无参数的场景 #define ADD_FUNCTION(func, ...) std::bind(&TestDriver::func, this, ##__VA_ARGS__)
- 第二步:注册带参数的handler时,直接在宏中传入需要绑定的参数即可
// 放开注释的测试用例,传入_twoParams需要的两个参数(示例为10和20) addTest("TWO_PARAMS", "two params", nullptr, ADD_FUNCTION(_twoParams, 10, 20), nullptr);
- 可选优化:如果不想用宏,也可以直接用lambda绑定参数,可读性更好:
addTest("TWO_PARAMS", "two params", nullptr, [this](){ return _twoParams(10, 20); }, nullptr);
方案优势
- 不需要修改原有
TestUnit的结构,兼容性强 - 天然支持任意数量、任意类型的参数绑定,只要handler返回值为int即可符合要求
- 运行逻辑和原有逻辑完全一致,没有额外性能损耗
运行时动态传参的适配方案
如果你的场景是TestUnit执行runTestUnit的时候才需要动态传入参数,只需做如下修改:
// 仅展示核心修改部分 struct TestUnit { // 省略原有字段 std::function<int(std::any)> _runTestHandler; // 执行时传入动态参数 void runTestUnit(std::any params) { // 省略原有setup、postRun逻辑 _result = _runTestHandler(params); } }; // 注册时处理参数解析 addTest("TWO_PARAMS", "two params", nullptr, [this](std::any params){ auto [x,y] = std::any_cast<std::pair<int,int>>(params); return _twoParams(x,y); }, nullptr); // 调用时传入动态参数 testUnit->runTestUnit(std::make_pair(10,20));
内容的提问来源于stack exchange,提问作者Sourav
相关产品推荐
相关产品推荐

