C++11包装器function

news2024/9/20 6:42:57

知识回顾:
 

在C中我们要调用一个函数是需要用到函数指针

在C++中我们调用一个函数有两种方法。1.仿函数。2.lambda

多种方式在调用时,就会出现多种情况,为方便接收,C++11引出包装器的概念

 std::function类模板函数是一个通用的可调用对象的包装器,它用简单的、统一的方式处理可调用对象。使用包装器之前需要包含头文件:#include <functional>

格式:function<返回类型(参数列表)>

如果std::function对象未包装可调用对象,使用std::function对象将抛出std::bad_function_call异常。

三种调用

1.普通函数

//普通函数
void swap_func(int& r1, int& r2)
{
	int tmp = r1;
	r1 = r2;
	r2 = tmp;
}

2.仿函数

//仿函数
struct Swap
{
	void operator()(int& r1, int& r2)
	{
		int tmp = r1;
		r1 = r2;
		r2 = tmp;
	}
};

3.lambda函数

	//lambda函数
	auto swaplambda = [](int& r1, int& r2) {
		int tmp = r1;
		r1 = r2;
		r2 = tmp;
	};

包装器的使用

	//利用包装器包装
	//包装基础函数--只传函数地址(函数名)
	function<void(int&, int&)> f1 = swap_func;
	f1(x, y);
	cout << x << " " << y << endl << endl;
	//包装仿函数--调用用A()
	function<void(int&, int&)> f2 = Swap();
	f2(x, y);
	cout << x << " " << y << endl << endl;
	//包装lambda函数--传lambda对象名
	function<void(int&, int&)> f3 = swaplambda;
	f3(x, y);
	cout << x << " " << y << endl << endl;

由function包装器定义知道,是一个function类,而使用类就需要创造一个类对象才能调用类里的东西,所以每个function包装器都需要创建一个类对象去接收对应需要包装的函数/对象

接收后function包装器定义的对象就是该包装器所包装的函数的函数名,可直接使用该对象去调用函数f3(x, y);

创造map去列出一系列对应可调用函数

	//列表初始化
	map<string, function<void(int&, int&)>> cmdOP = {
		{"函数指针", swap_func},
		{"仿函数", Swap()},
		{"lambda", swaplambda},
	};
	//map含有键值对《a,b》,[a]调用后就访问的他对应的b对象
	cmdOP["函数指针"](x, y);
	cout << x << " " << y << endl << endl;

	cmdOP["仿函数"](x, y);
	cout << x << " " << y << endl << endl;

	cmdOP["lambda"](x, y);
	cout << x << " " << y << endl << endl;

全部代码

#include<iostream>
#include<map>
#include<algorithm>
#include<functional>
using namespace std;

//普通函数
void swap_func(int& r1, int& r2)
{
	int tmp = r1;
	r1 = r2;
	r2 = tmp;
}

//仿函数
struct Swap
{
	void operator()(int& r1, int& r2)
	{
		int tmp = r1;
		r1 = r2;
		r2 = tmp;
	}
};

int main()
{
	int x = 0, y = 1;
	//原数
	cout << x << " " << y << endl;
	
	//lambda函数
	auto swaplambda = [](int& r1, int& r2) {
		int tmp = r1;
		r1 = r2;
		r2 = tmp;
	};

	//利用包装器包装
	//包装基础函数--只传函数地址(函数名)
	function<void(int&, int&)> f1 = swap_func;
	f1(x, y);
	cout << x << " " << y << endl << endl;
	//包装仿函数--调用用A()
	function<void(int&, int&)> f2 = Swap();
	f2(x, y);
	cout << x << " " << y << endl << endl;
	//包装lambda函数--传lambda对象名
	function<void(int&, int&)> f3 = swaplambda;
	f3(x, y);
	cout << x << " " << y << endl << endl;

	//列表初始化
	map<string, function<void(int&, int&)>> cmdOP = {
		{"函数指针", swap_func},
		{"仿函数", Swap()},
		{"lambda", swaplambda},
	};
	//map含有键值对《a,b》,[a]调用后就访问的他对应的b对象
	cmdOP["函数指针"](x, y);
	cout << x << " " << y << endl << endl;

	cmdOP["仿函数"](x, y);
	cout << x << " " << y << endl << endl;

	cmdOP["lambda"](x, y);
	cout << x << " " << y << endl << endl;

	return 0;
}

类的成员函数和普通调用区别

详细见:bind

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于接口多态,何时使用接口名创建对象?何时使用子类创建对象?

接口创建对象只能创建他的实现类&#xff0c;所以会出现两种创建方式&#xff1a; 1、接口 对象名 new 类名 2、子类对象 对象名 new 类名 举个例子&#xff0c;swimming是一个接口&#xff0c;flog是他的一个实现类&#xff0c;重写了swimming的eat()方法 子类对象 对象名…

纵观全球经济,为何众多卖家做跨境都要考虑沃尔玛1P?

​​在全球经济的大背景下&#xff0c;跨境电商成为了许多卖家的优先选择&#xff0c;其中沃尔玛1P模式更是备受瞩目。 这一现象的产生&#xff0c;可以归因于四个方面的因素&#xff1a; 一、沃尔玛作为全球最大的零售商之一 ​具有极高的品牌知名度和市场影响力。这为卖家提…

索引与书架、新华字典的爱恨情仇

在MySQL的索引世界中&#xff0c;性能优化一直是开发者们关注的焦点。而索引&#xff0c;作为提升查询速度的关键技术之一&#xff0c;是非常重要的。索引根据存储类型可以分为聚簇索引(聚集)与非聚簇索引(非聚集)&#xff0c;它们决定了数据在磁盘上的存储方式和查询时的访问路…

视频去水印网站,视频去水印工具

在当今数字化时代&#xff0c;视频已成为人们生活中不可或缺的一部分。然而&#xff0c;许多视频都带有水印因此&#xff0c;了解并掌握视频去水印的方法变得尤为重要。今天我分享一个视频去水印的简单方法。 打开" 51视频处理官网" 。打开网站后&#xff0c;上传视…

11.【机器学习】十大算法之一随机森林算法原理讲解

【机器学习】十大算法之一随机森林算法原理讲解 一摘要二个人简介三什么是随机森林&#xff1f;3.1 决策树3.2 集成方法3.2.1 Bagging方法3.2.2 Boosting方法 3.3 随机森林算法3.4 随机的含义 四案例演示一4.1 利用随机森林进行特征选择&#xff0c;然后使用SVR进行训练4.2 利用…

罗盘时钟屏保你见过吗?非常有特色的电脑时钟屏保

很多人都用过屏保&#xff0c;印象中系统自带的屏保&#xff0c;款式比较少&#xff0c;就那几款&#xff0c;在桌面飞来飞去的动画&#xff0c;基本都不怎么好看&#xff0c;特别有印象的就是那种泡泡屏保&#xff0c;这个算是比较美观的了。今天小编给大家介绍一款非常有特色…

智能制造 | 璞华科技入选「2023年苏州市智能制造优秀服务商」公式名单

刚刚&#xff0c;璞华科技入选「2023年苏州市智能制造优秀服务商」公示名单&#xff01;再次表明&#xff0c;璞华科技在智能制造领域的实力得到了业界认可。 璞华科技有限公司是一家以“帮助客户实现数智化转型升级”为愿景的高科技企业&#xff0c;在苏州、武汉、北京、香港、…

欢度盛夏,畅享清凉——七月超市营销策略

随着七月的到来&#xff0c;我国大部分地区进入夏季&#xff0c;气温逐渐攀升&#xff0c;消费者们对清凉、消暑产品的需求也随之增长。在这个夏日&#xff0c;超市应该如何抓住这一商机&#xff0c;提升销售业绩呢&#xff1f;本文将从商品陈列、促销活动等方面&#xff0c;为…

【AI一键启动】ChatTTS语音合成WebUI界面一键启动,开箱即用!

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Linux进程概念(个人笔记)

Linux进程概念 1.冯诺依曼体系结构2.操作系统&#xff08;先描述&#xff0c;再组织&#xff09;3.进程3.1查看进程的方式3.2通过系统调用获取进程标识符3.4查看进程中常见字段状态的指令3.3fork创建子进程3.3.1fork的原理 3.4进程状态3.5进程优先级3.5.1Linux内核的调度队列与…

10 种语言文本准确渲染;Mac无需联网的本地聊天应用;多模态语言模型(MLM)基准测试的引擎;Yolo DotNet版本

✨ 1: Glyph-ByT5 10 种语言文本准确渲染&#xff0c;将文本渲染的准确性从提高到近 90% &#xff0c;同时还能实现段落渲染自动布局 Glyph-ByT5是一种定制的文本编码器&#xff0c;旨在实现准确的文字视觉渲染。其核心思想是通过细致的字形-文本配对数据集的微调&#xff0c…

机器学习课程复习——隐马尔可夫

不考计算题 Q:概率图有几种结构? 条件独立性的公式? 顺序结构发散结构汇总结构Q:隐马尔可夫模型理解? 概念 集合:状态集合、观测集合 序列:状态序列、观测序列

Excel如何设置自动更新的固定选项

日常工作中你是否想要某数据列设置固定选项&#xff0c;如人力组、财务组、综合组、业务组等&#xff0c;可用“数据验证”实现&#xff0c;如后期新增选项“党建组”&#xff0c;该如何快速处理&#xff1f; 今天刘小生分享“超级表数据验证”方式&#xff0c;只实现固定选项…

Shardingsphere-Proxy 5.5.0部署

Shardingsphere-Proxy 5.5.0部署 Shardingsphere系列目录&#xff1a;背景下载安装包Linux解压安装包修改配置文件global.yamldatabase-sharding.yaml配置没有单表情况配置有单表的情况背景 引入数据库驱动启动代理连接代理数据库Navicate工具连接MYSQL客户端连接 Shardingsphe…

PopupWindow 和 Dialog 的区别,我们应该选择哪一个呢?

引言 在安卓开发中&#xff0c;PopupWindow 和 Dialog 是两种常用的弹出窗口组件。虽然它们的用途类似&#xff0c;但在实际应用中有很多区别。本文将详细探讨 PopupWindow 和 Dialog 的区别&#xff0c;帮助开发者更好地选择和使用这两种组件。 什么是 PopupWindow&#xff…

MySQL学习笔记-进阶篇-SQL优化

SQL优化 插入数据 insert优化 1&#xff09;批量插入 insert into tb_user values(1,Tom),(2,Cat),(3,Jerry); 2&#xff09;手动提交事务 mysql 默认是自动提交事务&#xff0c;这样会导致频繁的开启和提交事务&#xff0c;影响性能 start transaction insert into tb_us…

【Linux】Xshell和Xftp简介_安装_VMware虚拟机使用

1、简介 Xshell简介 Xshell是一款强大的安全终端模拟软件支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。该软件通过互联网实现到远程主机的安全连接&#xff0c;并通过其创新性的设计和特色帮助用户在复杂的网络环境中高效工作。Xshell可以在Windows界面下访问远端不…

云上宝库:三大厂商对象存储安全性及差异性比较

前言 看了几家云厂商的对象存储&#xff0c;使用上有相似也有差异&#xff0c;聊聊阿里云、腾讯云、京东云三家对象存储在使用中存在的风险以及防护措施。 0x01 云存储命名 阿里云对象存储OSS(Object Storage Service)&#xff0c;新用户免费试用三个月&#xff0c;存储包容…

数据分析:RT-qPCR分析及R语言绘图

介绍 转录组分析是一种用于研究细胞或组织中所有RNA分子的表达水平的高通量技术。完成转录组分析后&#xff0c;科学家们通常需要通过定量实时聚合酶链式反应&#xff08;qRT-PCR&#xff09;来验证二代测序&#xff08;Next-Generation Sequencing, NGS&#xff09;结果的可靠…