Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用引用lambda函数调用函数?_C++_Visual Studio_Lambda - Fatal编程技术网

C++ 如何使用引用lambda函数调用函数?

C++ 如何使用引用lambda函数调用函数?,c++,visual-studio,lambda,C++,Visual Studio,Lambda,代码: typedef void(*callbackType)(int); callback类型globalCallback; void setit(回调类型回调){ globalCallback=回调; } int main(){ int localVar=5; setit([](int num){ 上面的代码有一些问题 如果不需要捕获任何内容,可以使用lambda将其转换为函数指针: typedef void(*callbackType) (int); callbackType globa

代码:

typedef void(*callbackType)(int);
callback类型globalCallback;
void setit(回调类型回调){
globalCallback=回调;
}
int main(){
int localVar=5;
setit([](int num){

上面的代码有一些问题

如果不需要捕获任何内容,可以使用lambda将其转换为函数指针:

typedef void(*callbackType) (int);

callbackType globalCallback;

void setit(callbackType callback) {
  globalCallback = callback;
}

int main() {
  int localVar = 5;
  setit([](int num) {
    std::cout << localVar; // there is an error here
  });
}
但是这个技巧只适用于无船长的lambdas

一种可能的解决方案是更改
callbackType
并改用
std::function

typedef void(*callbackType)(int);

callbackType globalCallback;

void setit(callbackType callback) {
  globalCallback = callback;
}

int main() {
  setit(+[](int){});
}
使用callbackType=std::function;
callback类型globalCallback;
void setit(回调类型回调){
globalCallback=回调;
}
int main(){
int localVar=5;
setit([localVar](int-num){

上面的代码有一些问题

如果不需要捕获任何内容,可以使用lambda将其转换为函数指针:

typedef void(*callbackType) (int);

callbackType globalCallback;

void setit(callbackType callback) {
  globalCallback = callback;
}

int main() {
  int localVar = 5;
  setit([](int num) {
    std::cout << localVar; // there is an error here
  });
}
但是这个技巧只适用于无船长的lambdas

一种可能的解决方案是更改
callbackType
并改用
std::function

typedef void(*callbackType)(int);

callbackType globalCallback;

void setit(callbackType callback) {
  globalCallback = callback;
}

int main() {
  setit(+[](int){});
}
使用callbackType=std::function;
callback类型globalCallback;
void setit(回调类型回调){
globalCallback=回调;
}
int main(){
int localVar=5;
setit([localVar](int-num){

std::cout捕获lambda不会转换为函数指针。使用
std::function
instead捕获lambda不会转换为函数指针。使用
std::function
instead?5.1.2[expr.prim.lambda]的
+
是什么“没有lambda捕获的lambda表达式具有一个公共非虚拟非显式常量转换函数,该函数指向与闭包类型的函数调用运算符具有相同参数和返回类型的函数指针“使用std::function可以吗?这里dude说std::function很重。还有其他方法吗?@LightAlex-您已经到了优化代码的地步了?首先关注正确性。@A.A-
+
是显式地导致对指针类型的强制。@LightAlex”很重”正如它在许多其他语言中隐含和有规律地做的那样,但在C++中却不那么多。“没有lambda捕获的lambda表达式具有一个公共非虚拟非显式常量转换函数,该函数指向与闭包类型的函数调用运算符具有相同参数和返回类型的函数指针“使用std::function可以吗?这里dude说std::function很重。还有其他方法吗?@LightAlex-您已经到了优化代码的地步了?首先关注正确性。@A.A-
+
是显式地导致对指针类型的强制。@LightAlex”很重”正如它在许多其他语言中隐含和有规律地做的,但在C++中却不是那么多。