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

C++代码第33-38与47-52行回调函数重复问题如何解决

C++ 重复回调逻辑优化方案

优化思路

两处lambda回调逻辑、捕获规则完全一致,且doSomething_1与doSomething_2的局部变量定义、传参逻辑也高度重合,我们可以通过提取公共辅助方法消除重复:

  • 可选方案1:仅提取回调构造逻辑,适合需要保留两个方法独立结构的场景
  • 可选方案2:提取全链路公共逻辑,彻底消除所有重复代码(更推荐)

推荐实现(全量去重)

通过模板接收X的成员函数指针作为差异化参数,把所有重复逻辑收拢到私有辅助方法中:

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

struct X 
{
   void func(std::function<void(int)>f, int x)
   {
       f(x);
   }
   
    void func2(std::function<void(int)>f, int x)
   {
       f(x);
   }
};

struct Y 
{
    void doSomething_1()
    {
        // 仅传入差异化的X成员函数即可
        invokeXFunc(&X::func);
    }
    
    void doSomething_2()
    {
        invokeXFunc(&X::func2);
    }
    
private:
    // 公共辅助方法,模板参数为X的成员函数签名
    template<typename XFunc>
    void invokeXFunc(XFunc x_func)
    {
        int x = 10;
        bool called = false;
        // 复用回调逻辑
        auto callback = [&x, &called](int xx)
        {
            called = true;
            x++;
            xx++;
        };
        // 调用传入的X成员函数
        (x_.*x_func)(callback, 20);
    }

    X x_;
};


int main()
{
    Y y;
    y.doSomething_1();
    y.doSomething_2();
    
    return 0;
}

轻量实现(仅去重回调)

如果不需要调整原有方法的结构,仅消除回调部分的重复,可以单独提取回调构造方法:

struct Y 
{
    void doSomething_1()
    {
        int x = 10;
        bool called = false;
        x_.func(buildCallback(x, called), 20);
    }
    
    void doSomething_2()
    {
        int x = 10;
        bool called = false;
        x_.func2(buildCallback(x, called), 20);
    }
    
private:
    std::function<void(int)> buildCallback(int& x, bool& called)
    {
        return [&x, &called](int xx)
        {
            called = true;
            x++;
            xx++;
        };
    }

    X x_;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:05