首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 成員函式指標模板:跨類別統一呼叫機制

     編輯:關於C語言

問題背景

普通函式指標能封裝同簽名的自由函式,成員函式指標能封裝同一類別的同簽名成員函式。但如何統一呼叫不同類別的同簽名成員函式?結合類別模板與函式模板即可實現。

核心實作

#include <iostream>

class CA {
public:
    int Sum(int a, int b) { return a + b; }
};

class CB {
public:
    float Sum(float a, float b) { return a + b; }
};

template <typename ClassType, typename ParaType>
class CC {
public:
    // 成員函式指標型別別名
    using pClassFun = ParaType (ClassType::*)(ParaType, ParaType);

    // 統一呼叫介面
    ParaType Result(ClassType* obj, pClassFun fun, ParaType a, ParaType b) {
        return (obj->*fun)(a, b);
    }
};

int main() {
    // 整數版
    CA ca;
    CC<CA, int> cc;
    std::cout << "Sum: " << cc.Result(&ca, &CA::Sum, 3, 4) << std::endl;

    // 浮點版
    CB cb;
    CC<CB, float> fcc;
    std::cout << "Sum: " << fcc.Result(&cb, &CB::Sum, 3.3f, 4.6f) << std::endl;
}

關鍵點總結

  1. 類別模板參數化類別與參數型別,ClassType 代表目標類別,ParaType 代表參數/回傳型別。
  2. 成員函式指標語法:ReturnType (ClassName::*)(ArgTypes),使用時需 (obj->*ptr)(args)。
  3. 模板定義需置於頭檔或同一編譯單元,否則連結階段會找不到實體化代碼。

應用場景

  • 策略模式的無虛擬函式實作
  • 回呼機制的類型安全封裝
  • 序列化/反序列化的統一調度

來源:https://www.cnblogs.com/xianyunhe/archive/2011/11/27/2265148.html

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved