將類別成員函數作為回調傳遞
在某些情況下,開發人員可能會遇到將類別成員函數作為回調傳遞給外部API。由於 C 語法的複雜性以及指標在該語言中的重要作用,此任務可能特別令人困擾。
遇到的一個常見錯誤訊息是:
Error 8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
編譯器建議使用& ;CLoggersInfra::RedundancyManagerCallBack 源自以下事實:RedundancyManagerCallBack 函數屬於CLoggersInfra 類,而不屬於任何類該類別的特定實例。因此,它被視為靜態成員函數。將靜態成員函數作為回呼參數傳遞需要使用取址運算子 &。
然而,這只是冰山一角。真正的挑戰在於解決成員函數具有隱式 this 參數的事實,該參數指定它們所屬類別的實例。在提供的範例程式碼中,RedundancyManagerCallBack 函數需要在 CLoggersInfra 類別的特定實例上執行。
有多種方法可以解決此問題:
1.建立包裝對象:
一種選擇是建立一個單獨的對象,該物件封裝指向所需類別實例的指標並公開呼叫所需成員函數的方法。然後可以將此包裝物件作為回調參數傳遞。
2.使用std::bind1st 或boost::bind:
這些函式庫提供了建立函式物件或綁定的機制,將函式的第一個參數固定為特定值。在這種情況下,可以將 this 指標鎖定到特定實例,從而有效地建立一個僅採用必要參數的新函數。
3.使用Lambda 函數(C 11 以上版本):
在C 11 及更高版本中,可以使用lambda 函數來擷取this 指標並建立滿足要求的回調函數。這是一個簡潔而優雅的解決方案,不需要額外的包裝物件或外部函式庫。
理解成員函數的意義和指標的作用對於有效解決這個問題至關重要。透過利用本文中描述的技術,開發人員可以自信地將類別成員函數作為回調傳遞,並彌合自己的程式碼和外部 API 之間的差距。
以上是如何將 C 類成員函數作為回調傳遞給外部 API?的詳細內容。更多資訊請關注PHP中文網其他相關文章!