![](/img/trans.png)
[英]How to add void/null as default argument to a function/lambda pointer, in C++?
[英]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表達式的void*
指針的問題是lambda表達式的結果是一個真實的誠實對象,而不是指向對象的指針。 就像你不能將std::vector
或std::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.