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

C++如何将不同签名的函数作为参数传递给其他函数以精简代码

解决方案

核心思路是通过参数预绑定把不同函数的差异化参数提前在调用侧处理,让所有传入通用函数的可调用对象符合统一签名约定,不需要修改原有函数的实现。

方案1:std::function + Lambda 捕获(C++11及以上支持,最常用)

通过Lambda把不同函数的额外参数提前捕获,把所有传入通用函数的可调用对象统一为int(std::string*)的签名。

代码实现

#include <functional>
#include <string>
#include <iostream>
using namespace std;

// 原有函数不需要做任何修改
int doSomething(string* s, int i) {
    *s = "doSomething res";
    return i;
}
int doSomethingOther(string* s, string t) {
    *s = "doSomethingOther res: " + t;
    return 0;
}

// 通用函数,所有重复公共逻辑都放在这里
void generalFct(function<int(string*)> f) {
    string s;
    // 这里放重复的公共逻辑:do some stuff
    int res = f(&s);
    cout << "res: " << res << " s: " << s << endl;
    // 这里放后续重复的公共逻辑:do some other stuff
}

int main() {
    int num = 10;
    string s = "test str";

    // 调用doSomething:捕获num参数适配签名
    generalFct([num](string* str) {
        return doSomething(str, num);
    });

    // 调用doSomethingOther:捕获s参数适配签名
    generalFct([s](string* str) {
        return doSomethingOther(str, s);
    });

    return 0;
}

该方案代码可读性高,适配灵活,新增其他签名的目标函数时不需要修改通用函数的实现。

方案2:模板实现(无运行时开销)

如果对性能要求较高,不想承担std::function类型擦除的开销,可以用模板实现通用函数,编译期会为不同的可调用对象生成特化版本,运行效率和手动写重复代码完全一致。

代码实现

#include <utility>
// 模板通用函数
template<typename Callable>
void generalFct(Callable&& f) {
    string s;
    // 公共逻辑
    int res = std::forward<Callable>(f)(&s);
    cout << "res: " << res << " s: " << s << endl;
    // 后续公共逻辑
}

// main函数调用逻辑和方案1完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:24:02