首頁 > 後端開發 > C++ > 如何將帶有捕獲變數的 C Lambda 函數傳遞給函數指標?

如何將帶有捕獲變數的 C Lambda 函數傳遞給函數指標?

Susan Sarandon
發布: 2024-12-14 10:48:15
原創
207 人瀏覽過

How Can I Pass C   Lambda Functions with Captured Variables to Function Pointers?

將帶有捕獲變數的Lambda 函數傳遞給C 中的函數指標

在C 中使用lambda 函數時,可以隱式轉換為函數指標一個方便的功能。然而,帶有捕獲變數的 lambda 在這方面提出了挑戰,因為它們無法隱式轉換。

為了解決這個問題,我們需要了解潛在的限制。捕獲 lambda 會維護它們在定義時引用的變數的副本。這種封閉狀態產生了對作用域的依賴,而這種依賴無法用函數指標來表達。

由於指標的固有特性,無法明確轉換為函數指標。指標標識函數在記憶體中的位置,但它們不能攜帶捕獲變數引入的狀態。

要解決此限制,有幾種方法:

  1. 建立一個函數物件: 使用operator() 重載定義一個類似類別的函數對象,此重載封裝了捕獲的變數和邏輯。然後這個函數物件就可以當函數指標。然而,這種方法可能會犧牲一些簡潔的 lambda 語法。
  2. 作為函數物件傳遞:將 lambda 函數作為函數物件而不是函數指標傳遞。例如,類別 std::function, const stat, int)>;可以保存 lambda 並用作函數指標替代品。
  3. 引用外部變數: 使用可由 lambda 函數引用的全域或靜態變數。這種方法允許 lambda 和外部作用域之間進行通信,但可能會引入全局狀態依賴性和潛在的並發問題。

考慮以下範例來說明使用捕獲的變數作為函數指標傳遞lambda函數物件方法:

#include <ftw.h>
#include <iostream>

using namespace std;

class Callback {
public:
    void operator()(const char *fpath, const struct stat *sb, int typeflag) {
        cout << fpath << endl;
    }
};

int main() {
    vector<string> entries;
    Callback callback;

    int ret = ftw("/etc", callback, 1);

    for (auto entry : entries) {
        cout << entry << endl;
    }

    return ret;
}
登入後複製

在這個範例中,我們建立了一個Callback 類,它實現了函數呼叫operator() 來模仿lambda 函數的行為。然後,我們可以將此類的實例作為函數指標傳遞給 ftw 函數,從而有效地保留捕獲的變數。

透過了解將捕獲 lambda 轉換為函數指標的限制並利用替代方法,開發人員可以有效地使用需要函數指標的上下文中的 lambda。

以上是如何將帶有捕獲變數的 C Lambda 函數傳遞給函數指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板