將類別成員函數作為回調傳遞
當使用需要函數指標作為回呼的API 時,嘗試傳遞時可能會出現困難來自類別本身的類別成員函數。本文探討了這個問題的複雜性,並提供了有效解決此問題的解決方案。
問題陳述
考慮一個假設的類 CLoggersInfra,它包含一個成員函數 RedundancyManagerCallBack 。您試圖在另一個API 函數Init 中使用此成員函數作為回調,但遇到以下編譯錯誤:
Error 8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
深入研究問題
The錯誤來源於C 中成員函數的基本特徵。雖然它們看起來只屬於特定的類別實例,但它們本質上會接收一個額外的隱藏參數,該參數是對類別實例本身的引用。這通常稱為“this”指針。
解決方案解釋
1.使用Boost
Boost,一個第三方庫,提供了一個強大的工具來解決這個問題:boost::bind。它允許您建立一個“鎖定”特定參數的新函數。在這種情況下,隱藏的「this」參數可以鎖定到特定的類別實例,從而有效地建立一個只有一個可見參數的新函數。
2.使用自訂物件包裝
或者,您可以建立一個自訂對象,該物件接受對類別實例的引用,並提供一個“run”或“execute”方法,該方法使用提供的參數來呼叫成員函數。但是,這種方法需要修改 API 以接受自訂物件而不是原始函數指標。
3. C 11 Lambda 函數
在 C 11 及更高版本中,lambda 函數提供了更優雅的解決方案。它們可以捕獲“this”指針,從而無需單獨的自訂物件。 Lambda 函數提供了一種簡潔且方便的方法來實現所需的功能。
結論
理解成員函數的內在本質及其隱藏的「this」參數對於成功地將它們作為回調傳遞。透過利用 boost::bind 或 C 11 lambda 函數的功能,您可以有效解決編譯錯誤並順利地將類別成員函數用作回調函數。
以上是如何將 C 類別成員函數作為回調傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!