在模板編程中,常需將類的成員函數或成員變量作為模板參數傳遞,實現泛型調用。本文演示基本語法與用法。
Ret (Class::*Ptr)(Args...)Type Class::*Ptr(obj->*funcPtr)(args)、obj->*varPtr = value#include <iostream>
using namespace std;
class TestClass {
public:
void testFunc(int val) { cout << "testFunc: " << val << '\n'; }
double testFunc2(double val) { return val * 2; }
int m_testVal = 0;
};
// 非模板別名
using TestFunc = void (TestClass::*)(int);
// 模板調用成員函數
template <class T, class Ret, class Param>
void callMember(T* obj, Ret (T::*func)(Param), Param p) {
(obj->*func)(p);
}
// 模板設置成員變量
template <class T, class Param>
void setMember(T* obj, Param T::*var, Param p) {
obj->*var = p;
}
int main() {
TestClass* obj = new TestClass;
// 1. 直接使用成員函數指針
TestFunc f1 = &TestClass::testFunc;
(obj->*f1)(7);
// 2. 模板調用不同簽名的成員函數
callMember(obj, &TestClass::testFunc, 6);
callMember(obj, &TestClass::testFunc2, 6.9);
// 3. 模板設置成員變量
setMember(obj, &TestClass::m_testVal, 5);
cout << "m_testVal = " << obj->m_testVal << '\n';
delete obj;
return 0;
}
callMember 接收對象指針、成員函數指針、參數,實現統一調用入口。setMember 同理用於成員變量賦值,雖較少用但某些框架 (如序列化、ORM) 需要。