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

