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

C++ 模板中使用類成員函數指針與成員變量指針

     編輯:關於C++

場景

在模板編程中,常需將類的成員函數或成員變量作為模板參數傳遞,實現泛型調用。本文演示基本語法與用法。

核心語法

  • 成員函數指針類型: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;
}

關鍵點解析

  1. callMember 接收對象指針、成員函數指針、參數,實現統一調用入口。
  2. setMember 同理用於成員變量賦值,雖較少用但某些框架 (如序列化、ORM) 需要。
  3. 模板參數推導自動匹配返回類型與參數類型,無需手動指定。

應用場景

  • 信號槽機制、事件分發
  • 屬性反射、序列化框架
  • 策略模式中動態綁定成員函數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved