普通函式指標能封裝同簽名的自由函式,成員函式指標能封裝同一類別的同簽名成員函式。但如何統一呼叫不同類別的同簽名成員函式?結合類別模板與函式模板即可實現。
#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;
}
ClassType 代表目標類別,ParaType 代表參數/回傳型別。ReturnType (ClassName::*)(ArgTypes),使用時需 (obj->*ptr)(args)。來源:https://www.cnblogs.com/xianyunhe/archive/2011/11/27/2265148.html