Lambda表达式、std::function、和std::bind函数

2023-11-20

Lambda表达式、std::function、和std::bind函数

Lambda表达式

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

1、capture:捕获外部变量列表
2、parameters:参数列表,如果不需要参数可以省略,“()”可以i一起省略
3、mutable:指示符,有来表示是否可以修改捕获的变量;默认Lambda函数是一个const函数;
4、exception:异常设定
5、return type:返回类型;不需要返回类型时,可以将“->”一起省略;如果函数体重有return语句,则Lambda表达式的返回类型由函数体中return语句的返回类型决定;如果函数体中没有没有return语句 ,则返回类型为void类型;
6、statement:函数体,与普通函数一样;

格式

[capture list] (params list) -> return type {function body};
[capture list] (params list) {function body};
[capture list] {function body};

捕获值列表

Lambda表达式可以捕获所在作用域可访问的值,包括临时变量、类的可访问成员,全局变量,可在函数体中使用这些变量;捕获方式可以是按值捕获,也可以是按引用捕获;

1、[ ]:没有使用任何函数或对象;
2、[=]:Lambda表达式所在函数体内可用的所有变量,包括类的this指针,是怡值传递的凡方式;
3、[&]:与[=]捕获的变量一样,但是以引用的方式捕获;
4、[var]:将某个变量var以值传递的方式捕获;
5、[&var]:将某个变变量var以引用的方式捕获;
6、[=,&var]:除变量var以引用 的方式捕获,其他的以值传递的方式捕获;

#include<iostream>         
using namespace std;       
                           
int main()                 
{                          
    int num = 10;            
    auto val_lambda = [=]{ return num + 1; };
    auto ref_lambda = [&]{ return num + 1; };
    cout<<"val_lambda: "<<val_lambda()<<endl;
    cout<<"ref_lambda: "<<ref_lambda()<<endl;
                           
    num++;                   
    cout<<"val_lambda: "<<val_lambda()<<endl;
    cout<<"ref_lambda: "<<ref_lambda()<<endl;
                           
    return 0;              
}
程序输出结果如下:
 
val_lambda: 11
ref_lambda: 11
val_lambda: 11
ref_lambda: 12

std::function

std::function包含在头文件中,是一个类模板,可以对各种可调用实体进行封装,形成一个新的可调用std::function对象;
可调用实体包括普通函数,Lambda表达式,函数指针以及其他函数对象(仿函数);

#include <iostream>
#include <functional>

using namespace std;
function<bool(int, int)> fun;

bool compare_com(int a, int b)
{
	return a > b;
}

auto compare_lambda = [](int a, int b) {return a > b; };

class compare_class
{
public:
	bool operator()(int a, int b)
	{
		return a > b;
	}
};

class compare
{
public:
	bool compare_num(int a, int b)
	{
		return a > b;
	}

	static bool compare_static(int a, int b)
	{
		return a > b;
	}
};

int main()
{
    bool result;
    fun = compare_com;
    result = fun(10, 1);
    cout << "普通函数输出, result is " << result << endl;
 
    fun = compare_lambda;
    result = fun(10, 1);
    cout << "lambda表达式输出, result is " << result << endl;
 
    fun = compare_class();
    result = fun(10, 1);
    cout << "仿函数输出, result is " << result << endl;
 
    fun = compare::compare_static;
    result = fun(10, 1);
    cout << "类静态成员函数输出, result is " << result << endl;
 
    //类普通成员函数比较特殊,需要使用bind函数,并且需要实例化对象,成员函数要加取地址符
    compare temp;
    fun = std::bind(&compare::compare_member, temp, std::placeholders::_1, std::placeholders::_2);
    result = fun(10, 1);
    cout << "类普通成员函数输出, result is " << result << endl;

std::bind

std::bind是一个通用函数的适配器,通过接受一个可调用对象来生成一个新的可调用对象,可将可调用对象与其参数一起进行绑定,后使用std::function保存,有两个作用

1、将可调用对象啊和其参数绑定成一个仿函数;
2、只绑定部分参数,减少可调用对象传入的参数

std::function<bool(int) func;
func = std::bind(compare_class, 5, std::placeholders::_1);
cout << "bind函数测试" << func(6) << endl;

bind绑定类成员函数时,第一个参数表示类对象的成员函数的指针,第二个表示对象或对象地址;
std::placeholders::_1是占位符,从小到大确定对应的参数;

https://blog.csdn.net/xiaoyink/article/details/79348806?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase
https://blog.csdn.net/xihuanzhi1854/article/details/89889461?utm_medium=distribute.pc_relevant_download.none-task-blog-BlogCommendFromBaidu-2.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-BlogCommendFromBaidu-2.nonecas

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lambda表达式、std::function、和std::bind函数 的相关文章

  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 检查数据库中是否存在记录

    我正在使用这些代码行来检查记录是否存在 SqlCommand check User Name new SqlCommand SELECT FROM Table WHERE user txtBox UserName Text conn int
  • 为什么模板类的静态成员不唯一

    看一下下面的代码 include
  • Xamarin 测试记录器选项有错误。无法记录自动化测试

    选项 gt Xamarin gt Xamarin Test Recorder 中的所有设置都有错误 我的桌面上安装了 Visual Studio 2015 企业版 以及 Xamarin 和 Xamarin Test Recorder 插件
  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • 为什么迭代器类型推导失败? [复制]

    这个问题在这里已经有答案了 为什么这在 C 中不起作用 为什么我不能限制foo的参数为std vector
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • 如何从命名空间内重载运算符<<

    这是我能想到的最小的包含示例 首先是类的标题 每当使用 pragma once ifndef EURO H define EURO H include
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • 使用 ClosedXML 附加到 excel 文件

    我需要将新数据附加到使用 ClosedXML 创建的现有 Excel 文件中 如何使用 ClosedXML 附加到 Excel 文件 如何获取最后一条记录的行号并将其附加到该行号上 或者还有其他内容 Thanks 打开现有工作簿 然后使用L
  • 指向 VLA 的指针

    你可能知道 VLA 的优点和缺点 https stackoverflow com a 3082302 1606345在 C11 中它们是可选的 我认为使 VLA 成为可选的主要原因是 堆栈可能会爆炸 int arr n where n 10
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 这个元组创建习惯有名字吗?

    On the 增加邮件列表 http lists boost org Archives boost 2014 06 214213 php LouisDionne 最近发布了以下创建类似元组的实体的巧妙技巧 include
  • 在 C++ 中什么时候首选传递指针而不是引用传递?

    我可以想象一种情况 其中输入参数可以为 NULL 以便首选传递指针而不是传递引用 有人可以添加更多案例吗 在传递的对象实际上将被修改的情况下 有些人更喜欢传递指针 当对象通过引用传递时 它们使用 pass by const referenc
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • SQL Server CE 不兼容的数据库版本

    我有一个 SQL Server CE 4 0 数据库 sdf文件 当我尝试从我的应用程序 WPF 对数据库进行查询时 出现以下错误 数据库版本不兼容 如果这是兼容文件 请运行修复 其他情况请参考文档 数据库版本 4000000 请求的版本
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js

随机推荐

  • PTA(A)1074 Reversing Linked List (25point(s))(坑)

    思路 最后一个点是坑 可能存在孤立点 代码 include
  • vscode的Document This插件

    Document This插件 主要针对JavaScript 和 TypeScript 语言生成注释 光标放在函数名上 连续按 两下 Ctrl Alt D description param number x param number y
  • 【分库分表】sharding-jdbc—分片策略

    目录 StandardShardingStrategy ComplexShardingStrategy InlineShardingStrategy HintShardingStrategy NoneShardingStrategy 标准分
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • 线上问题排查----------ORG.APACHE.CATALINA.CONNECTOR.CLIENTABORTEXCEPTION: JAVA.IO.IOEXCEPTION: BROKEN PIPE

    今天公司技术支持的童鞋报告一个客户的服务不工作了 紧急求助 于是远程登陆上服务器排查问题 查看采集数据的tomcat日志 习惯性的先翻到日志的最后去查看有没有异常的打印 果然发现了好几种异常信息 但是最多还是这个 24 Nov 2016 0
  • Golang-使用 goroutine 运行闭包的“坑”

    介绍 在 Go 语言中 函数支持匿名函数 闭包就是一种特殊的匿名函数 它可以用于访问函数体外部的变量 需要注意的是 在 for range 中 使用 goroutine 执行闭包时 经常会掉 坑 因为匿名函数可以访问函数体外部的变量 而 f
  • 【Android】从零搭建组件化项目

    组件化系列文章介绍的内容稍微多了点 本着研究透这玩意的精神 从组件化的简介开始说起 目录 简介 组件化 模块化与插件化 开始 创建配置共享文件 打包模式配置 APT与JavaPoet 简介 什么是组件化 将多个功能模板拆分 重组的过程 为什
  • VM安装windows7 32位

    首先你电脑必须安装了 VMware 推荐版本 VMware12 或者 VMware 11 版本 然后你还需要一个系统镜像 可以通过下面链接下载 Win7 的镜像 复制链接 打开迅雷新建任务即可下载 Windows7 64位 ed2k fil
  • ubuntu换源为阿里云源

    切换目录到 etc apt 目录下 备份sources list文件 sudo cp sources list sources list bak 然后执行换源脚本 在当前路径下 sudo sources sh 脚本下载路径 http dow
  • BFS遍历树和DFS遍历树

    遍历树 按照遍历的顺序 如不清楚图的遍历 请先阅读图的遍历 绘制成树型结构 DFS遍历树 以下为图到遍历树的转化 如果不清楚图的遍历 请先阅读笔者的另一篇文章 图的遍历 动图 按照DFS遍历的顺序 绘制成一棵树 途中红色的边就是遍历过程中没
  • 软件测试题目

    一 判断题 每题2分 20 1 软件测试就是为了验证软件功能实现的是否正确 是否完成既定目标的活动 所以软件测试在软件工程的后期才开始具体的工作 初级 2 发现错误多的模块 残留在模块中的错误也多 初级 3 测试人员在测试过程中发现一处问题
  • Linux CentOS 7.5安装JDK1.8

    CentOS 7 5安装JDK1 8 Linux系统版本 CentOS 7 5 64位 下载JDK1 8 JDK 1 8官方下载地址 https www oracle com technetwork java javase download
  • tomcat 将详细日志写入mysql数据库

    http tomcat apache org tomcat 6 0 doc api org apache catalina valves JDBCAccessLogValve html conf server xml
  • 基础教学丨UiBot主界面、可视化、源代码视图操作

    基础教学丨UiBot主界面 可视化 源代码视图操作 今天主要讲解UiBot软件主界面 可视化视图 源代码视图的相关操作 目录 1 软件主界面操作 2 可视化视图操作 3 源代码视图操作 1 软件主界面操作 UiBot主界面布局如下 1 菜单
  • 【Java必修课】判断String是否包含子串的四种方法及性能对比

    1 简介 判断一个字符串是否包含某个特定子串是常见的场景 比如判断一篇文章是否包含敏感词汇 判断日志是否有ERROR信息等 本文将介绍四种方法并进行性能测试 2 四种方法 2 1 JDK原生方法String indexOf 在String的
  • QT画扇形和椭圆

    void MainWindow paintEvent QPaintEvent QPainter painter this painter setRenderHint QPainter Antialiasing true int radius
  • DTC status 为0x23的原因分析

    正常情况下dtc状态不可能出现0x23 当出现0x23可能是达芬奇中如下配置所致 1 PendingDtcProcessing设置为storeonly 此设置会导致没有分配快照空间的dtc无法set pending位 而且被displace
  • Python中的def函数

    概念 Python中的def语句用于定义一个函数 函数是一个代码块 它可以被重复调用 并且可以接收输入参数和返回值 在Python中 函数是由def关键字 函数名和圆括号内的参数列表组成的 场景 以下是几个函数使用场景的示例 阶乘计算 在计
  • Syntax Error: Error: Node Sass does not yet support your current environment...报错解决

    报错 Syntax Error Error Node Sass does not yet support your current environment Windows 64 bit with Unsupported runtime 93
  • Lambda表达式、std::function、和std::bind函数

    Lambda表达式 std function 和std bind函数 Lambda表达式 capture parameters mutable exception gt return type statement 1 capture 捕获外