C++11 包装器

news2025/1/24 5:11:18

1.function包装器

1.1 概念介绍

ret = func(x);
上面 func 是什么呢?那么 func 可能是函数名,函数指针,函数对象 ( 仿函数对象 ), 也可能是lamber 表达式对象,这些都是可调用的类型。

函数包装器,也称为函数适配器或函数封装器,是一种编程模式,用于将函数或对象包装在另一层抽象中,以改变其调用签名或行为。C++中的function本质是一个类模板,也是一个包装器。其包含在头文件<functional>。function可以把这些所有参数类型和返回值类型相同的可调用类型(函数指针,仿函数对象,lamber表达式对象),统一的管理起来,让它们都变成一个类型。

1.2 语法使用

function类原型:

模板参数说明:
Ret : 被调用函数的返回类型
Args… :被调用函数的形参
使用如下:
#include<iostream>
#include <functional>
using namespace std;
int f(int a, int b)
{
	return a + b;
}
struct Functor
{
public:
	int operator() (int a, int b)
	{
		return a + b;
	}
};
int main()
{
	// 函数名(函数指针)
	function<int(int, int)> func1 = f;
	cout << func1(1, 2) << endl;
	// 函数对象
	function<int(int, int)> func2 = Functor();
	cout << func2(1, 2) << endl;
	// lamber表达式
	function<int(int, int)> func3 = [](int a,int b)
	{return a + b; };
	cout << func3(1, 2) << endl;
	return 0;
}

在上述代码中,f函数,Functor仿函数,以及lambda表达式,它们的返回值都是int,参数类型也是int,int,因此可以经过包装器包装为function<int(int,int)>而变为同一类型,这样就可以统一管理了。

1.3 function包装类的成员函数

class Plus
{
public:
	static int plusi(int a, int b)
	{
		return a + b;
	}
	double plusd(double a, double b)
	{
		return a + b;
	}
};
int main()
{
	//类的成员函数
	function<int(int, int)> func4 = &Plus::plusi;
	cout << func4(1, 2) << endl;
	//用法一
	function<double(Plus, double, double)> func5 = &Plus::plusd;
	cout << func5(Plus(), 1.1, 2.2) << endl;
	//用法二
	function<double(Plus*, double, double)> func6 = &Plus::plusd;
	Plus tmp;
	cout << func6(&tmp, 1.1, 2.2) << endl;
	return 0;
}

在使用function包装类的成员函数时需要注意,类的非静态成员函数参数中天然包含了一个该类指针参数,即this指针。所以我们包装时需要在function参数列表中也加上该类指针或者该类,实例化时也同理。

1.4 实例应用

int evalRPN(vector<string>& tokens) {
	map<string, function<int(int, int)>> opfunc = {
		{"+",[](int x,int y) { return x + y; }},
		{"-",[](int x,int y) { return x - y; }},
		{"*",[](int x,int y) { return x * y; }},
		{"/",[](int x,int y) { return x / y; }},
	};
	stack<int> q;
	for (auto& e : tokens)
	{
		if (e == "+" || e == "-" || e == "*" || e == "/")
		{
			int num1 = q.top();
			q.pop();
			int num2 = q.top();
			q.pop();
			q.push(opfunc[e](num2, num1));
		}
		else
		{
			q.push(stoi(e));
		}
	}
	return q.top();
}

2.bind包装器

2.1 概念介绍

std::bind是C++11中引入的一个函数适配器,它允许您绑定函数或函数对象的一部分参数,从而创建一个新的可调用实体。std::bind的定义位于<functional>头文件中。它的基本用途是将一个函数与其参数一起进行绑定,生成一个新的函数对象,这个新对象可以在不同的上下文中被调用,而不需要再次提供那些已经绑定的参数。

2.2 语法使用

第一个参数为可调用对象,后续参数为该可调用对象的参数。其后续参数的语法比较特别,C++11后新增一个命名空间域placeholders,其内部会存储很多变量,这些变量用于函数的传参,变量的名字为_x,表示第x个参数。例如_1可调用对象的第一个参数,_2为第二个参数。

使用如下:

using namespace placeholders;
int Plus(int a, int b)
{
	return a + b;
}
class Sub
{
public:
	int sub(int a, int b)
	{
		return a - b;
	}
};
int main()
{
	//表示绑定函数plus 参数分别由调用 func1 的第一,二个参数指定,将placeholders空间
	//展开后即可直接使用_x.
	function<int(int, int)> func1 = bind(Plus, placeholders::_1,_2);
	//func2的类型为 function<int(int, int)> 与func1类型一样
	//表示绑定函数 plus 的第一,二为: 10, 20,即可不用传参
	auto  func2 = bind(Plus, 10, 20);
	// 参数调换顺序
	auto Div = [](int a, int b) { return a / b; };
	auto func3 = bind(Div, _2, _1);
	cout << func1(1, 2) << endl;
	cout << func2() << endl;
	cout << func3(20, 60);
	return 0;
}

一般而言,我们用bind函数可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M 可以大于N,但这么做没什么意义)参数的新函数。同时,使用bind函数还可以实现参数顺序调整等操作。

2.3 function包装类的成员函数

class Sub
{
public:
	int sub(int a, int b)
	{
		return a - b;
	}
};
int main()
{
	Sub s;
	function<int(int, int)> func4 = bind(&Sub::sub, s, _1, _2);
	cout << func4(1, 2) << endl;
	return 0;
}

在使用bind包装类的成员函数时需要注意,类的非静态成员函数参数中天然包含了一个该类指针参数,即this指针。所以我们包装时需要在bind参数列表中也加上该类指针或者该类,实例化时也同理。

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

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

相关文章

comfyui老照片修复工作流,直接复制到comfyui中即可使用

ComfyUI是一个基于web的图形用户界面,用于直观地构建和运行AI模型流程。它特别适合于使用Stable Diffusion等模型进行图像生成任务。然而,ComfyUI本身并不直接提供老照片修复的功能,但你可以通过组合不同的节点来实现这一目标。 老照片修复通常涉及到几个关键步骤: 图像去…

人像修复-插件磨皮

破锤和DR5插件磨皮 破锤插件&#xff08;更快磨皮&#xff09;DR5&#xff08;更好保留皮肤纹理&#xff09; 破锤插件&#xff08;更快磨皮&#xff09; 打开方式&#xff1a;滤镜->Imagenomic->Portraiture 磨皮阈值一般控制在10-20之间若环境与肤色接近&#xff0c;容…

PYTHON专题-(3)你应该知道python内置函数

abs() 函数返回数字的绝对值。dict() 函数用于创建一个字典。help() 函数用于查看函数或模块用途的详细说明。min() 方法返回给定参数的最小值&#xff0c;参数可以为序列。max() 方法返回给定参数的最大值&#xff0c;参数可以为序列。round() 方法返回浮点数 x 的四舍五入值&…

【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 (多输入单输出)Matlab代码

【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 &#xff08;多输入单输出&#xff09;Matlab代码 目录 【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 &#xff08;多输入单输出&#xff09;Matlab代码效果一览基本介绍程序设计参考资料 效果一…

中国数字孪生进入爆发期,平台级产品决定市场高度

MIT 教授 Geoffrey Parker在《平台革命》中认为&#xff0c;平台正在吞噬整个世界&#xff0c;平台赋予开放的参与式架构&#xff0c;设定合理的参与规则&#xff0c;通过创新的产品、服务为所有参与者创造价值。 与现实世界类似&#xff0c;在数字孪生世界中&#xff0c;数字…

分享5款.NET开源免费的Redis客户端组件库

前言 今天大姚给大家分享5款.NET开源、免费的Redis客户端组件库&#xff0c;希望可以帮助到有需要的同学。 StackExchange.Redis StackExchange.Redis是一个基于.NET的高性能Redis客户端&#xff0c;提供了完整的Redis数据库功能支持&#xff0c;并且具有多节点支持、异步编…

JavaScript基础——Date日期对象常见的用法

Date日期对象 查看Date日期对象的数据类型 创建Date日期对象的实例 获取Date日期对象的属性 设置Date日期对象的属性 日期和时间的比较 获取时间戳 比较时间戳 Date日期对象 JavaScript中的Date类型&#xff0c;提供了一种处理日期和时间的方法&#xff0c;用于创建表示…

OD C卷 - 多线段数据压缩

多段 线 数据压缩 &#xff08;200&#xff09; 如图中每个方格为一个像素&#xff08;i&#xff0c;j&#xff09;&#xff0c;线的走向只能水平、垂直、倾斜45度&#xff1b;图中线段表示为(2, 8)、&#xff08;3,7&#xff09;、&#xff08;3, 6&#xff09;、&#xff08…

tcp westwood 比 reno,cubic 好在哪

今天说说 tcp 韦斯特伍德&#xff0c;和昨天 dctcp 的路子一样&#xff0c;主要还是一个观点&#xff0c;信息带来性能收益。 reno&#xff0c;cubic 仅做孤立 aimd&#xff0c;没有将 rtt 用到极致&#xff0c;信息相当于浪费掉了&#xff0c;而 westwood 却充分利用 ack 和 …

Python数值计算(21)——非扭结点三次样条曲线

前面介绍到紧固和自然三次样条曲线&#xff0c;这次介绍一下非扭结点三次样条曲线。所谓的非扭结点&#xff0c;是指由于最开始的两个子区间使用插值多项式相同&#xff0c;最后两个子区间所使用的插值多项式也相同&#xff0c;这就会导致在这段多项式上起不到扭结点的效果&…

E26.【C语言】练习:打印整数二进制的奇数位和偶数位

获取一个整数二进制序列中所有的偶数位和奇数位&#xff0c;分别打印出二进制序列 要会打印奇或偶序列&#xff0c;先学会打印二进制序列 下面我的这篇文章的代码稍作修改即可 E24.【C语言】练习&#xff1a;求一个整数存储在内存中的二进制中1的个数&#xff08;两种方法&a…

一键体验Detectron2框架中的所有预训练模型

Detectron2是由Facebook AI Research (FAIR)推出的基于PyTorch的模块化物体检测库&#xff0c;发布于2019年10月10日。该平台原是2018年推出的Detectron的第二代版本&#xff0c;它完全重写于maskrcnn-benchmark&#xff0c;并采用了PyTorch语言实现。与原版相比&#xff0c;De…

(五)activiti-modeler 编辑器初步优化

最终效果: 1..首先去掉顶部的logo,没什么用,还占用空间。 修改modeler.html文件,添加样式: <style type="text/css"> #main-header{display: none; } #main{padding: 0px; } </style> 2.左边组件选择区域太宽了,一般用不到那么宽。 修改editor…

Linux驱动入门实验班day03-GPIO子系统概述

3.通用框架1——最简单方式1&#xff1a;执行命令cat /sys/kernel/debug/gpio查看串口信息 gpio4对应的下列 方式2&#xff1a; 对于按键GPIO4_14:对应第四组第14个引脚 gpiochip3 ,从96开始&#xff0c; 9614110&#xff1b;

如何获取公网IP

前言 有些时候我们需要获取电脑或者服务器的公网 IP&#xff0c;例如我们访问的目标地址需要限制 IP 白名单或者限制访问来源&#xff0c;又或者我们使用了代理&#xff0c;想试试有没有生效。要获取公网 IP 无法从电脑或服务器的本地配置中获取&#xff0c;如 ipconfig&#…

利用 Angular 发挥环境的力量

一.介绍 您是否曾想过如何在不同的环境中为同一应用设置不同的颜色、标题或 API 调用&#xff1f;可以肯定的是&#xff0c;生产 API 和测试 API 是不同的&#xff0c;应谨慎使用。部署时&#xff0c;我们不会在项目的所有地方手动更改所有 API 调用。不应这样做&#xff0c;因…

基于Yolov8面部七种表情检测与识别C++模型部署

表情识别 七种表情识别是一个多学科交叉的研究领域&#xff0c;它结合了心理学、认知科学、计算机视觉和机器学习等学科的知识和技术。 基本概念 表情的定义&#xff1a;表情是人们在情绪体验时面部肌肉活动的结果&#xff0c;是人类情感交流的基本方式之一。基本表情理论&a…

matplotlib显示opencv读取的图片颜色异常,BGR转RGB的两种方式:cv2.cvtColor与img[:,:,::-1]

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

github添加ssh密钥,通过ssh方式推送代码

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取python编程资料 很多人在使用github的时候&#xff0c;如果还是使用https的方式推送代码的话&#xff0c;可能会…

《LeetCode热题100》---<5.①普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第一道&#xff1a;最大子数组和&#xff08;中等&#xff09; 第二道&#xff1a;合并区间&#xff08;中等&#xff09; 第一道&#xff1a;最大子数组和&#xff08;中等&#xff09; 法一&#xff1a;贪心算法 class So…