簡體   English   中英

如何使用無類型函數指針調用C ++成員函數

[英]How to call C++ member function using typless Function Pointer

我正在嘗試創建C ++ Timer模塊,並計划將回調函數傳遞給我的API。 這樣,其他模塊可以注冊回調,並且當發生超時時,我可以通知它。 在C中使用簡單的函數指針很容易做到這一點,但是在C ++中,我們如何傳遞現有實例的Member函數。 因為當計時器調用回調(成員)方法時,我需要訪問成員(此指針)。

有很多例子知道被調用對象的類型,但是我正在創建一個通用模塊,因此我沒有做任何更改以將其強制轉換為成員的確切類型。

我沒有使用C ++ 11這么舊的版本用於舊版嵌入式軟件。

我的API可能是

void (*TimerCallback)(void);

Timer::TimerCallback userCB;

Timer::Timer(TimerCallback cb) {
    userCB = cb;
}

void Timer::invoke() {
    userCB();
}

讓我們假設我有一個需要計時器的C ++類

class myModule {
private:
    Timer* timer;
    void timerCallbackFunc(void) { 
      count << "This " << this << endl; 
    }
public:
    myModule() {
        timer = new Timer(timerCallbackFunc);
    }
}

但是我找不到用所有者的this指針調用成員函數的任何方法,因此無法訪問成員字段。

C ++有什么方法或任何限制嗎?

謝謝。

似乎您需要一些簡單的東西,而不是在C ++ 03中重新發明C ++ 11。

因此,請考慮使用舊的C樣式回調,在該回調中您將客戶端代碼的狀態指針傳遞給該回調。 客戶端代碼可以像這樣:

timer = new Timer( timerCallback, this );

在回調(普通的命名空間作用域函數或static類成員)中,它以必須正確轉換的void*獲取this參數,然后調用非static成員函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM