c++ - 通过 lambda 函数转发附加参数
问题描述
这是最小的可重现代码,
#include <iostream>
#include <string>
void bar(std::string s, int x){
std::cout <<std::endl<< __FUNCTION__<<":"<<s<<" "<<x;
}
using f_ptr = void(*)(std::string);
void foo(f_ptr ptr){
ptr("Hello world");
}
template<typename T> void fun(T f){
static int x;
std::cout <<std::endl<<x++<<std::endl;
f("Hello World");
}
int main()
{
//case:1
f_ptr ptr1 = [](std::string s){bar(s,10);};
// foo(ptr1);
//case:2
static int x =10;
f_ptr ptr2 = [x](std::string s){bar(s,x);};
//foo(ptr2);
//case:3
int y =10;
f_ptr ptr3 = [y](std::string s){bar(s,y);}; /* error*/
foo(ptr3);
//case:4
int z = 12;
fun([z](std::string s){bar(s,z);});
return 0;
}
错误:
main.cpp:25:50: error: cannot convert ‘main()::’ to ‘f_ptr {aka void (*)(std::basic_string)}’ in initialization
f_ptr ptr3 = [y](std::string s){bar(s,y);}; /* error*/
我的问题是,
- 有没有办法
case:3
通过 lambda 转发其他参数? - 什么转换导致错误
case:3
? - 中
case:4
,typename T
推导出什么?
解决方案
- 有没有办法
case:3
通过 lambda 转发其他参数?- 什么转换导致错误
case:3
?
带有捕获列表的 Lambda 不能隐式转换为函数指针;没有捕获的 lambdas 可以。你可以std::function
改用,
void foo(std::function<void(std::string)> f){
f("Hello world");
}
或者像这样fun
做一样直接采用 lambda。
- 中
case:4
,typename T
推导出什么?
该类型将是唯一的闭包类型;lambda 表达式是该类型的纯右值表达式。
推荐阅读
- apache-spark - Py4JJavaError:调用 o57.sql 时发生错误。:org.apache.spark.SparkException:作业中止
- php - 使用 ajax 和 jquery 对 sql 行进行即时复选框更新
- flutter - Flutter 如何使用 BottomNavigationBar 管理单独的导航堆栈?
- android - 将文件写入外部存储,以便用户可以从文件存储访问
- php - 是否有 PHPDoc 标准来描述通过引用传递的函数属性?
- ios - Xcode 11.5 不支持 iOS 13.6?
- amazon-web-services - 我需要使用 cloudfront 和 s3 重定向我的 url
- javascript - Ajax 调用在 Visual Studio 代码中不起作用(2020 年 6 月)
- powershell - 如何使用 Powershell 在 Edge Chromium 中设置主页?
- angular - 如何生成 FormArray 项?