簡體   English   中英

C ++如何獲取指向lambda函數的void指針?

[英]C++ How to get a void pointer to a lambda function?

我甚至無法輸入示例代碼......很丟失。 這是我的原始函數,它不是lambda函數(我希望它是lambda)。

static void* DoublePointer(void** arg, int arg_sz) {
    double* n1 = In(arg[0]);
    double* n2 = In(arg[1]);
    double* n3 = In(arg[arg_sz-1]);

    *n3 = *n1 + *n2;

    return n3;
}

void* func_ptr = DoublePointr; //works fine

但我真正想要的是:

my_class.save_the_func = [](void** arg, int arg_sz) {
    double* n1 = In(arg[0]);
    double* n2 = In(arg[1]);
    double* n3 = In(arg[arg_sz-1]);

    *n3 = *n1 + *n2;

    return n3;
}

my_class.point_to_func = save_the_func // point_to_func is the void* member

你最后得到一個指向lambda函數的void *你需要做什么? 就像我說的,非lambda函數工作得很好。

我之所以這么想是因為最終我希望我的代碼看起來像這樣:

std::vector<function_entry> MyFuncEntry ={
add_function("MRP_DoublePointer2", "double", "double,double", "n1,n2", "add two numbers",
    [](void** arg, int arg_sz)->void* {
    double* n1 = In(arg[0]);
    double* n2 = In(arg[1]);
    double* n3 = In(arg[arg_sz-1]);

    *n3 = *n1 + *n2;

    return n3;
}),

add_function("MRP_DoublePointer3", "double", "double,double", "n1,n2", "add two numbers",
    [](void** arg, int arg_sz)->void* {
    double* n1 = In(arg[0]);
    double* n2 = In(arg[1]);
    double* n3 = In(arg[arg_sz-1]);

    *n3 = *n1 + *n2;

    return n3;
})

};

換句話說,我想在同一個地方定義一個函數和一些其他所需的參數。 Add_function返回一個function_entry類,它包含一些字符串加上lambda函數,基本上我正在嘗試在函數旁邊定義那些字符串,這樣它更容易維護,它不在兩個不同的地方。

如果這是壞的/計算上昂貴的,那么我想我應該堅持非lambda。

這是我得到的錯誤: lambda錯誤

獲取指向lambda表達式的void*指針的問題是lambda表達式的結果是一個真實的誠實對象,而不是指向對象的指針。 就像你不能將std::vectorstd::string分配給void* ,你不能將lambda表達式的結果賦給void*

有趣的是,您編寫的初始代碼 - 將函數指針指定給void* - 實際上並不能保證編譯! C ++標准區分了函數指針和對象指針,並且它們在兩者之間不可移植。 事實上,一些編譯器會完全拒絕您的代碼。

如果需要存儲指向任意函數類型的指針,請考慮使用std::function ,它是類型安全的,更清楚地表明您要執行的操作。

你想做的只會在某些情況下起作用; 最后看到警告。 Lambda不是函數,你不能為它們獲取函數指針地址。 但是,你可以做的是同時創建一個函數和一個lambda。

std::function f;
void call_f()
{
    f();
}

只需分配給f並將call_f的地址call_f給您的API。

大警告:這甚至不像編寫的那樣遠程線程安全。 如果您在多處理環境中需要,請將其保護為任何其他一次性使用的資源。 如果只有一個是熱點太多,你可以制作一個固定大小的函數池,但這要復雜得多。

以格式聲明C風格labmda函數的類型名稱

return_type ( * ) ( params )

在我們的例子中,它將是這樣的:

using my_lambda_type = void*(*)(void**, int)

現在我們聲明:

my_lambda_type my_func = [](void** args, int arg_sz)->void* { /*do stuff*/ }

您可以省略->void*來自動推斷返回類型。

最后:

void* my_func_pointer = my_func;

獎金,這里是如何將c風格的lambda定義為函數參數輸入

void func_with_func_parameter(void*(*par_name_goes_here)(void**, int)) 
{
    //do stuff
}

同樣如下:

void func_with_func_parameter(my_lambda_type param_name_goes_here) 
{
    //do stuff
}

暫無
暫無

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

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