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
相关产品推荐
相关产品推荐

