C++ 和 C# 中的 lambda的方法技巧

目录
  • 一、语法定义
  • 二、谨慎在哪里?
    • 1. 谨慎1 :屏蔽外部所有作用域变量
    • 谨慎2:屏蔽所有按值传递的修改

前言:

这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11标准 加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我们简单聊一聊。

一、语法定义

首先我们看下 C++ 语法定义格式:

[capture] (parameters) mutable ->return-type{statement}

相比 C# lambda 的语法格式:

(parameters) => {return-type statement}

要复杂一些,之所以复杂还是因为 C++ 让程序员用的必须更谨慎一些。

二、谨慎在哪里?

为了说明更谨慎在哪里,我们上一个简单的例子。

int main() {
	int a = 1;
	int b = 2;
	auto func = [](int c) -> void {
		cout << "input:" << c << endl;
	};
	func(10);
	return 0;
}

上面就定义了一个原子化的 lambda 函数,在现实开发中往往不仅要获取参数,还要获取 外部作用域 的变量,比如说,我想计算 a+b+c 的结果,

接下来稍微改一下代码:

可以看到,居然给报错了,在 C# 中可是一点问题都没有。

1. 谨慎1 :屏蔽外部所有作用域变量

C++ 默认屏蔽所有的外部作用域值,这么做大概率还是想让程序员知道自己的意图,这相比 C# 要严谨的多,算是喜忧参半吧。

那如何让 C++ 代码通过呢? 这就需要用到语法格式中的 [capture] 部分,简而言之就是需要告诉编译器打开栅栏放哪些变量进来,比如 =,&,两者都可以访问所有的外部作用域变量,不同的是前者是 按传值方式,后者 按引用方式

按值方式

有了思路后,修改代码如下:

int main() {
	int a = 1;
	int b = 2;
	auto func = [=](int c) -> void {
		auto sum = a + b + c;
		cout << "sum:" << sum << endl;
	};
	func(10);
	return 0;
}

哈哈,这个问题我们完美搞定。

按引用方式

大家都知道,按引用 传的是地址,言外之意就是可以做到 原地修改,接下来我们修改下代码。

int main() {
	int a = 1;
	auto func1 = [&]() -> void {
		a = 10;
	};
	func1();
	cout << "a =" << a << endl;
	return 0;
}

谨慎2:屏蔽所有按值传递的修改

为了方便说明,我们先看图:

可以看到,按值传递进来的值都是无法修改的,这么做主要还是怕程序员弄混了,如果一定要让代码通过,就需要增加语法格式中的 mutable 项,本质上就是踢掉默认的 const ,这样在方法体中就可以修改 a 变量,

修改代码如下:

int main() {
	int a = 1;
	auto func1 = [=]() mutable -> void {
		a = 10;
	};
	func1();
	cout << "a =" << a << endl;
	return 0;
}

哈哈,成功修改,当然语句够简单的话,还可以将下面的代码:

auto func1 = [&]() -> void {
		a = 10;
	};

修改成如下:

auto func1 = [&]() {
		a = 10;
	};

关于作用域方面还有很多好玩的,比如只放某一个变量进来。

总体上来说,C++ 的 lambda 的格式相比 C# 更严谨,反过来说就是不太相信 C++ 程序员有能力用好。

到此这篇关于C++ 和 C# 中的 lambda的方法技巧的文章就介绍到这了,更多相关C++ lambda 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# 内部类与Lambda表达式用法详解

    目录 一.内部类 1.什么是内部类? 1.类作为形参和返回值: 2.内部类的几种形式 二.Lambda表达式(强调做什么,而不是以什么形式去做) 1.Lambda表达式的格式要求: 2.Lambda与匿名内部类的区别 1.省略模式 2.Lambda与匿名内部类的区别: 三.方法引用 1.方法的概述: 2.常见的方法引用方式: 3.方法引用的具体方式: 一.内部类 1.什么是内部类? 1.类作为形参和返回值: 抽象类作为形参和返回值: 通过多态的形式去传递抽象类作为形参的方法,方法的形参与返回值为

  • C#中Lambda表达式的用法

    目录 1.参数 2.多行代码 3.闭包 4.使用foreach语句的闭包 从C#3.0开始,可以使用lambda表达式把实现代码赋予委托.lambda表达式与委托(https://www.jb51.net/article/244051.htm)直接相关.当参数是委托类型时,就可以使用lambda表达式实现委托引用. static void Main() { string mid = ", middle part,"; Func<string, string> anonDel

  • C++中的Lambda函数详解

    目录 一 函数语法 二 函数应用 1.在普通函数中使用 2.在qt信号槽中使用 3.在std::sort排序函数中的使用 三 总结 一 函数语法 我们平时调用函数的时候,都是需要被调用函数的函数名,但是匿名函数就不需要函数名,而且直接写在需要调用的地方,对于以前没用过的小伙伴来说,第一眼看见了这语法可能很迷惑. C++11的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } (1) [capture] :[]内为外部变量的传递方

  • C# 本地函数与 Lambda 表达式详细介绍

    目录 1.C# 本地函数与 Lambda 表达式 2.Lambda 表达式 3.本地函数 4.那么,局部函数的目的是什么? 1.C# 本地函数与 Lambda 表达式 C# 局部函数通常被视为 lambda 表达式的进一步增强.虽然功能是相关的,但也存在重大差异. Local Functions 是嵌套函数]功能的 C# 实现.一种语言在支持 lambdas 之后获得对嵌套函数的支持几个版本是有点不寻常的.通常情况相反. Lambda 或一般的一流函数需要实现未在堆栈上分配且生命周期与需要它们的

  • C++Lambda表达式详解

    目录 概述 语法分析 捕获列表 关键字声明 示例 捕获列表按值传递 总结 概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda 的语法形式如下: [捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体} //计算两个值的和 auto func = [](int a, int b) -> int{return a+b;}; //当返回值的类型是确定时,可以忽略返回值 auto func = [](int

  • C++中的Lambda表达式及表达式语句

    目录 一.概念 二.左值与右值 三.类型转换 四.操作符 五.思考 1.思考下面x变量是左值还是右值,有什么特性? 2.思考一下以下赋值操作符的原始代码是怎样的? 3.思考以下代码做了什么事情? 一.概念 定义:表达式由一到多个操作数组成,可以求值并通常会返回求值结果: 最基本表达式:变量.字面值,通常包含操作符: 操作符特性: 1.接收几个操作数:一元.二元.三元: 2.对类型有要求(可能涉及类型转换): 3.操作数是左值还是右值: 4.结果的类型: 5.结果是左值还是右值: 6.优先级与结合

  • 关于C#10 新特性 Lambda 优化

    目录 1.Natural types for lambdas 2.Lambda Ref/Out/In Parameter Modifier 3.Lambda Return Type 4.Natual types for method 5.Lambda Attribute 6.More 前言: C# 10 对于 Lambda 做了很多的优化,我们可以在 C# 中更加方便地使用委托和 Lambda 了,下面就来看一些示例 1.Natural types for lambdas C# 10 可以更好做

  • C#使用表达式树(LambdaExpression)动态更新类的属性值(示例代码)

    有看过我之前发表过的C#相关文章分享和阅读过我代码的朋友们可能会在我的代码里面经常看到各种各样的λ表达式动态拼接,C#的λ表达式树是一个好东西,也是别的语言学不来的,熟悉掌握λ表达式就能够实现各种场景的个性化操作,如动态拼接查询条件.排序方式等,也能够实现替代反射的高性能操作,比如我们常用到的IQueryable和IEnumerable,每个扩展方法就全是λ表达式树. 本文给大家分享C#使用表达式树(LambdaExpression)动态更新类的属性值的相关知识,在某些业务中会遇到需要同步两个类

  • 一文读懂c++11 Lambda表达式

    1.简介 1.1定义 C++11新增了很多特性,Lambda表达式(Lambda expression)就是其中之一,很多语言都提供了 Lambda 表达式,如 Python,Java ,C#等.本质上, Lambda 表达式是一个可调用的代码单元[1]^{[1]}[1].实际上是一个闭包(closure),类似于一个匿名函数,拥有捕获所在作用域中变量的能力,能够将函数做为对象一样使用,通常用来实现回调函数.代理等功能.Lambda表达式是函数式编程的基础,C++11引入了Lambda则弥补了C

  • C++实例详解lambda表达式的使用

    目录 lambda表达式 1.lambda表达式语法 2.lambda应用 3.lambda表达式的应用实践 1.计算器案例 2.智能指针案例 3.优先级队列 lambda表达式 C++11 函数对象的升级版 => lambda表达式 函数对象的缺点:(需要定义一个类) 函数对象使用在 泛型算法参数传递 比较性质/自定义操作 优先级队列 智能指针(自定义智能指针的删除器) lambda表达式原理: 就是函数对象更高级的实现! 1.lambda表达式语法 例1: lambda表达式对应函数对象小括

随机推荐