首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於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:
    // 成員函數指針類型別名
    typedef ParaType (ClassType::*pClassFun)(ParaType, ParaType);

    // 統一調用介面
    ParaType Result(ClassType* pObj, pClassFun fun, ParaType a, ParaType b) {
        return (pObj->*fun)(a, b);
    }
};

int main() {
    // 測試整數
    CA ca;
    CC<CA, int> ccInt;
    std::cout << "The sum of a and b is " 
              << ccInt.Result(&ca, &CA::Sum, 3, 4) << std::endl;

    // 測試浮點數
    CB cb;
    CC<CB, float> ccFloat;
    std::cout << "The sum of fa and fb is " 
              << ccFloat.Result(&cb, &CB::Sum, 3.3f, 4.6f) << std::endl;

    return 0;
}

關鍵總結

  1. 模板結合:需同時運用類模板與函數模板,才能實現對不同類成員函數指針的泛型調用。
  2. 定義位置:類模板中的函數定義必須置於頭文件,或與調用點在同一文件且位於其上方,否則會導致編譯錯誤(模板實體化機制所致)。

此技巧在建立通用回調機制、策略模式或跨類別統一介面時極具價值。

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