栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++lambda 捕获

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++lambda 捕获

lambda相当于一个匿名函数
它是一个可调用对象 不管是对于线程 还是函数 function等
我们今天详细讲一下lambda的捕获

#include
class Demo {
public:
	Demo(int i):m(i){}
	void operator()() {
		[this] {std::cout << m << std::endl; }();
	}
	void demo(int a) {
		[=,this] { this->m = a; }();//有所不同的是只需要this就可以修改成员变量的值了
	}
	void test() {
		[this] {this->m = 111; }();	//其实加不jia=都可以直接改变成员变量,但是没用=捕获的话没办法获取传入的值,不能像上面那样
	}
private:
	int m = 0;
};
int main() {

	//当不接收参数的时候可以省略(),最后加上()是为了调用,下面这些产生的结果是一样的,至少在目前是的
	std::cout << [] { return 5; }() << std::endl;

	std::cout << []()->decltype(auto) {return 5; }() << std::endl;

	std::cout << []()->int {return 5; }() << std::endl;

	std::cout << []()->auto {return 5; }() << std::endl;


	int a = 0;
	//或者接收参数
	auto p = [](int b) {std::cout << b << std::endl; };
	p(a);
	auto p2 = [](auto b) {std::cout << b << std::endl; };
	p2(a);


	//或者直接捕获 下面的区别无非是捕获整个作用域和捕获具体的变量
	[=] {std::cout << a << std::endl; }();
	[i = a] {std::cout << i << std::endl; }();

	//或者直接修改
	[&] {a = 100; std::cout << a << std::endl; }();

	[&a] {a = 100; std::cout << a << std::endl; }();

	[ca=std::as_const(a)] ()mutable {ca = 10; std::cout << ca << std::endl; }();
	std::cout << a << std::endl;

	//下面这是在类内的捕获情况
	Demo demo(10);

	demo();

	demo.demo(123);

	demo();

	demo.test();//这种方式是无法改变成员变量的值的

	demo();


	//其实还有很多操作,最后补充一下,可以像下面这样
	int e(0), f(0), g(0);
	[E = e, F = f, G = g] {std::cout << E << ' ' << F << ' ' << G << std::endl; }();

	[&E = e, &F = f, &G = g] {E = 1, F = 2, G = 3; std::cout << E << ' ' << F << ' ' << G << std::endl; }();
	std::cout << e << ' ' << f << ' ' << g << std::endl;
	
	//另外,不省略()然后->指定类型啥的其实都行,如果是引用捕获的时候()mutable的话也合法,虽然没啥区别,先这样,语法糖而已
	return 0;
}

我们顺便再提一下C++14提出的可以在lambda内使用auto
简单的说就是能给lambda的形参类型写成auto演示如下

#include
#include
#include
#include



//编译器会默认为它构造下面这样一个类:
class SomeCompilerSpecificName {
public:
	SomeCompilerSpecificName(){}; // 构造函数只能由编译器调用
		template
	auto operator() (T1 x, T2 y) const {
		return x + y;
	}
};
int main()
{
	int x = 2;
	double y = 3.2,i=3.4;
	auto fool = [=](auto x, auto y) {return x + y; };
	std::cout << typeid(fool).name() << std::endl;
	std::cout << fool(x, y) << std::endl;//5
	std::cout << fool(x, i) << std::endl;//5.4
	return 0;
}
//下面是一个实际使用的例子
void test01() {
	std::arraystr{ "111","222" };
	std::for_each(std::begin(str), std::end(str), [](auto i) {std::cout << i << ","; });
}
void test02() {
	int num[5]{ 1,2,3,4,5 };
	std::for_each(std::begin(num), std::end(num), [](auto i) {std::cout << i << ","; });
}
int main()
{
	test01();
	test02();
	return 0;
}

还是很简单的 多用即可

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917404.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号