C++11 Lambda的变量捕获和Lambda在Qt中的应用
来源:互联网 发布:明源软件 编辑:程序博客网 时间:2024/05/24 07:32
一、Lambda
Lambda一般格式是:
[capture](param) mutable ->return-type {body}
这里主要复习一下Lambda中的capture
lambda中有个闭包的概念,也就是C这类语言中的域的概念,要访问闭包外的变量,就必须通过 [] 来捕获
[]的形式有以下
[] 未定义任何变量,不能访问lambda之外定义的变量
[x, &y] x是通过值复制来访问的,y通过引用访问
[&] 能通过引用访问外部所有变量
[=] 外部变量都是通过值复制来访问
[&, x] x通过值复制访问,其他变量通过引用访问
[=, &z] z通过引用访问,其他变量通过值捕获
这里有两个例子
int x=0;
int y = 42;
auto fun = [x, &y] {
std::cout<<"x: "<<x<<std::endl;
std::cout<<"y: "<<y<<std::endl;
y++;
}
x = y = 77;
fun();
fun();
std::cout<<"final y: "<<y <<std::endl;
输出结果为
x: 0
y: 77
x: 0
y: 78
final y: 79
这个例子很好理解,因为y是用引用传递的,在lambda中的改变也会反映到外部变量中,而x只是值传递,在lambda中只读
另一个例子
int id = 0;
auto fun = [id]() mutable {
std::cout<<"id: "<<id<<std::endl;
id++;
}
id = 42;
fun();
fun();
fun();
std::cout<<"id"<<std::endl;
输出结果为:
id: 0
id: 1
id: 2
42
这个例子中,在lambda的声明中使用了mutable。
在使用了mutable的lambda中,对象通过值传递,但可以在函数内部修改捕获变量的值。
有趣的是这个改变不会反映到外部变量
这非常类似不同函数总的静态变量
这里还要考虑一下lambda的类型问题
因为lambda是匿名函数对象,所以任何两个lambda的类型都不同。
在c++11中可以使用auto或者使用template来定义某lambda的类型,或者使用decltype()来获取类型
eg
std::function<int(int, int)> returnLambda() {
return [](int x, int y) {
return x*y;
}
}
二、在Qt中的应用
在Qt中主要用在槽函数中
eg.
connect(sender, &Sender::enabled, [=](bool enbaled) {
...
});
Lambda一般格式是:
[capture](param) mutable ->return-type {body}
这里主要复习一下Lambda中的capture
lambda中有个闭包的概念,也就是C这类语言中的域的概念,要访问闭包外的变量,就必须通过 [] 来捕获
[]的形式有以下
[] 未定义任何变量,不能访问lambda之外定义的变量
[x, &y] x是通过值复制来访问的,y通过引用访问
[&] 能通过引用访问外部所有变量
[=] 外部变量都是通过值复制来访问
[&, x] x通过值复制访问,其他变量通过引用访问
[=, &z] z通过引用访问,其他变量通过值捕获
这里有两个例子
int x=0;
int y = 42;
auto fun = [x, &y] {
std::cout<<"x: "<<x<<std::endl;
std::cout<<"y: "<<y<<std::endl;
y++;
}
x = y = 77;
fun();
fun();
std::cout<<"final y: "<<y <<std::endl;
输出结果为
x: 0
y: 77
x: 0
y: 78
final y: 79
这个例子很好理解,因为y是用引用传递的,在lambda中的改变也会反映到外部变量中,而x只是值传递,在lambda中只读
另一个例子
int id = 0;
auto fun = [id]() mutable {
std::cout<<"id: "<<id<<std::endl;
id++;
}
id = 42;
fun();
fun();
fun();
std::cout<<"id"<<std::endl;
输出结果为:
id: 0
id: 1
id: 2
42
这个例子中,在lambda的声明中使用了mutable。
在使用了mutable的lambda中,对象通过值传递,但可以在函数内部修改捕获变量的值。
有趣的是这个改变不会反映到外部变量
这非常类似不同函数总的静态变量
这里还要考虑一下lambda的类型问题
因为lambda是匿名函数对象,所以任何两个lambda的类型都不同。
在c++11中可以使用auto或者使用template来定义某lambda的类型,或者使用decltype()来获取类型
eg
std::function<int(int, int)> returnLambda() {
return [](int x, int y) {
return x*y;
}
}
二、在Qt中的应用
在Qt中主要用在槽函数中
eg.
connect(sender, &Sender::enabled, [=](bool enbaled) {
...
});
阅读全文
0 0
- C++11 Lambda的变量捕获和Lambda在Qt中的应用
- C++11 Lambda的变量捕获和Lambda在Qt中的应用
- Java Lambda的变量捕获
- lambda在C++中的应用
- Lambda在Comparator中的应用
- c++ lambda 捕获成员变量
- Qt connect中的 Lambda
- Java 8的Lambda及其在Android 开发中的应用
- Java 8 Lambda 捕获外部变量 -- 不可变的原因
- lambda:在android studio中的配置和使用lambda表达式
- 理解lambda在linq中的应用
- Lambda表达式在linq中的应用
- Lambda表达式在Android中的应用
- Lambda表达式在Android开发中的应用
- java8 lambda表达式在集合中的应用
- lambda函数在Tkinter中的一个应用
- c++ lambda表达式捕获变量参数
- [C# 5.0 IN A NUTSHELL,5th Edition读书笔记]Lambda表达式捕获(capture)迭代中的变量的相关问题
- 欢迎使用CSDN-markdown编辑器
- LinkedBlockingQueue源码分析
- Noip2015 Day2 T1 跳石头(二分答案)
- ODI使用MDX导出Essbase数据中文乱码问题
- Unity网格编程篇(二) 非常详细的Mesh编程入门文章
- C++11 Lambda的变量捕获和Lambda在Qt中的应用
- SQL中常用日期转换Covert(Datetime)
- php的学习路程
- Day50-Spring-04
- 使用spring自带的编码格式过滤器
- 设计模式-概述(new)
- Javascript优化相关
- 敏捷流程破解瀑布式流程介绍
- 绝对干货-国内值得关注的官方API集合,很全很强大(必须收藏)