在 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;
}
此技巧在建立通用回調機制、策略模式或跨類別統一介面時極具價值。