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

C++11如何消除参数个数不同的相似成员函数的代码重复

C++11 实现代码去重示例

你的实现思路是正确的,这里给出适配C++11的可运行实现方案,无需使用复杂的可变参数模板,通过通用模板+lambda即可解决差异函数参数不一致的问题:


修改后完整代码示例

类定义部分

class MyClass
{
public:
    // 原有对外接口完全保持不变,上层调用无感知
    void Post( CStream& responseStream );
    void Send();

    void send_report( CStream& responseStream, std::string );
    void publish_event( std::string string );

    // callbacks 接口不变
    void process( CStream& responseStream );
    void update();

private:
    // 新增私有通用模板函数,封装所有重复逻辑
    template<typename Func>
    void common_logic(Func&& diff_func);
};

函数实现部分

// 通用公共逻辑实现,所有重复代码仅保留一份
template<typename Func>
void MyClass::common_logic(Func&& diff_func)
{
    // ... 原开头重复代码段 ...
    std::string generated_str = "公共逻辑生成的字符串"; // 对应你原代码中的string变量
    // 调用传入的差异逻辑
    std::forward<Func>(diff_func)(generated_str);
    // ... 原结尾重复代码段 ...
}

void MyClass::Post( CStream& responseStream )
{
    // lambda捕获当前实例指针和responseStream参数,适配send_report的参数要求
    common_logic([this, &responseStream](const std::string& str) {
        this->send_report(responseStream, str);
    });
}

void MyClass::Send()
{
    // lambda仅捕获当前实例指针,适配publish_event的参数要求
    common_logic([this](const std::string& str) {
        this->publish_event(str);
    });
}

// 以下原有函数完全不需要修改
void MyClass::process( CStream& responseStream )
{
    // 其他代码
    Post( responseStream );
}

void MyClass::update()
{
    // 其他代码
    Send();
}

void MyClass::send_report( CStream& responseStream, std::string )
{
    // 差异实现
}
void MyClass::publish_event( std::string string )
{
    // 差异实现
}

实现说明

  • 模板函数接收任意可调用对象,比显式声明std::function性能更高,无额外运行时开销
  • lambda捕获机制完美解决两个差异函数参数不一致的问题,无需修改公共逻辑的参数列表
  • 完全基于C++11标准语法,无高版本依赖
  • 原有类的对外接口、回调函数实现完全不需要修改,侵入性极低

如果需要把公共逻辑实现放到cpp文件中避免模板代码暴露,可以改用std::function实现公共逻辑,声明如下即可,其余调用逻辑保持不变:

// 基于std::function的公共逻辑声明
private:
    void common_logic(const std::function<void(const std::string&)>& diff_func);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:27:03