C++11——包装器和绑定

news2024/12/25 8:59:40

1.包装器

C++中有一些可调用对象,比如 函数指针,仿函数对象 lambda等等,但是他们又有缺点

因此就引出了包装器的概念

包装器 function的头文件是<functional>

我们可以用包装器包装函数指针,仿函数,lambda

int f(int a, int b)
{
	return a + b;
}

struct functor
{
	int operator()(int a, int b)
	{
		return a + b;
	}
};

int main()
{
	//包装函数指针
	function<int(int, int)> f1 = f;
	cout << f1(10, 20) << "\n";

	//包装仿函数
	function<int(int, int)>f2 = functor();
	cout << f2(10, 20) << "\n";

	//包装lambda
	function<int(int, int)>f3 = [](int a, int b) {return a + b; };
	cout << f3(10, 20) << "\n";

	return 0;
}

用包装器解决逆波兰表达式

逆波兰表达式

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        map<string,function<int(int,int)>>Map={
            {"+",[](int a,int b){return a+b;}},
            {"-",[](int a,int b){return a-b;}},
            {"*",[](int a,int b){return a*b;}},
            {"/",[](int a,int b){return a/b;}}
        };
        for(auto& e:tokens)
        {
            if(Map.count(e))
            {
                int right=st.top();
                st.pop();
                int left=st.top();
                st.pop();
                st.push(Map[e](left,right));
            }
            else
            {
                st.push(stoi(e));
            }
        }
        return st.top();

    }
};

如果包装成员函数指针,需要注意哪些?

对于成员函数,要传this指针,使参数匹配,如果是静态成员函数,则没有this指针,要注意区分

class Plus
{
public:
	static int plusi(int a, int b)
	{
		return a + b;
	}

	double pulsd(double a, double b)
	{
		return a + b;
	}
};
int main()
{
	//对于静态成员函数,没有this指针,传参时可以不用传this指针
	function<int(int, int)> f1 = &Plus::plusi;
	cout << f1(10, 20) << "\n";

	//对于成员函数,需要传this指针,要求类型匹配
	//这里有两种写法,一种是传对象指针,一种是传对象
	function<double(Plus*,double, double)> f2 = &Plus::pulsd;
	Plus plus;
	cout << f2(&plus, 10, 20) << "\n";


	function<double(Plus, double, double)> f3 = &Plus::pulsd;
	cout << f3(Plus(), 10, 20) << "\n";

	return 0;
}

2.bind

std::bind定义在<functional>头文件里,是一个函数模板,他可以接受一个可调用对象,然后生成一个新的可调用对象,新的可调用对象的参数顺序或者参数个数可以发生改变,以此来适应原对象的参数列表,

int add(int a, int b)
{
	return a + b;
}

class Sub
{
public:
	int sub(int a, int b)
	{
		return (a - b);
	}

};
int main()
{
	//普通函数绑定
	auto f1 = bind(add, placeholders::_1, placeholders::_2);
	cout << f1(10, 20) << "\n";

	//成员函数绑定,要传this指针
	auto f2 = bind(&Sub::sub, placeholders::_1, placeholders::_2, placeholders::_3);
	Sub s1;
	cout << f2(&s1,20, 10) << "\n";

	//可以绑定this指针,然后就不需要再传this指针了,减少了传参个数
	Sub s2;
	auto f3 = bind(&Sub::sub, &s2,placeholders::_1, placeholders::_2);
	cout << f3(20, 10) << "\n";

	return 0;
}

bind的函数传参表示的含义,比如:

auto f3 = bind(&Sub::sub, &s2,placeholders::_1, placeholders::_2);

&Sub::sub :表示指定函数的地址,对于普通函数不需要加&符号,因为函数名就是地址,对于成员函数则需要加&符号;

&s2:表示成员函数的this指针,如果绑定的不是成员函数,则不需要写;

placeholders::_1, placeholders::_2 :表示需要传的参数;

bind还可以调换参数顺序

也就是说placeholders::_1永远表示传的第一个参数,placeholders::_2表示传的第二个参数,而对于fx函数来说,按照传参顺序,placeholders::_2表示a,placeholders::_1表示b,这样就实现了参数顺序的调换;

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

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

相关文章

关于LLC知识5

RLC的增益曲线不知一条 频率升高&#xff0c;增益会越来越低 无论在容性区还是感性区&#xff0c;当负载加重的时候&#xff0c;R阻值会变小&#xff0c;所以R的分压也会变小&#xff0c;导致增益会变低 当负载突然加重&#xff0c;输出电压会变低&#xff0c;增益曲线由红色变…

MySQL数据分析进阶(十二)设计数据库——PART3

※食用指南&#xff1a;文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记&#xff0c;笔记整理比较粗糙&#xff0c;主要目的自存为主&#xff0c;记录完整的学习过程。&#xff08;图片超级多&#xff0c;慎看&#xff01;&#xff09; 【中字】SQL进阶教程 | 史上最易懂S…

c++ - c++11(1)

文章目录 前言一、统一的列表初始化1、使用{ }初始化2、 std::initializer_list 二、声明1、auto2、decltype3、nullptr 三、范围for循环四、右值引用1、左值引用和右值引用2、左值引用和右值引用的比较3、左值引用的使用场景4、右值引用的使用场景5、完美转发 前言 一、统一的…

在百度飞浆中搭建pytorch环境

文章目录 1 先检查创建的环境2 创建虚拟环境3 最终结果 1 先检查创建的环境 选择GPU版本 检查python版本 2 创建虚拟环境 虚拟环境的创建 python3 -m venv env_name # (python3 -m 路径 环境名)激活虚拟环境 source env_name/bin/activate这里注意&#xff0c;同名文件…

MySQL的InnoDB的页里面存了些什么

文章目录 创建新表页的信息新增一条数据根据页号找数据信息脚本代码py_innodb_page_info根据地址计算页号根据页号计算起始地址 主要介绍数据页里面有哪些内容&#xff0c;一行数据在文件里面是怎么组织的 创建新表页的信息 CREATE TABLE test8 (id bigint(20) NOT NULL AUTO…

Android开发-使用FFmpeg-Android进行音视频处理

使用 FFmpeg-Android 进行音视频处理 1. 前言2. FFmpeg-Android 简介3. 功能介绍及实现3.1. 视频字幕添加Kotlin 代码示例&#xff1a;3.2. 尺寸剪切Kotlin 代码示例&#xff1a;3.3. 添加或去除水印Kotlin 代码示例&#xff1a;3.4. 时长截取Kotlin 代码示例&#xff1a;3.5. …

【十万个为什么】强磁场环境用什么编码器好?磁编为什么不怕强磁场?磁编与光编哪一个抗干扰强?

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、案例场景1&#xff1a;场景2&#xff1a; 二、为什么磁编可以在磁场中工作三、磁编为什么不怕强磁场&#xf…

LVS实战项目

LVS简介 LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层SLB(Server LoadBalance)是基于LVSkeepalived实现。 LVS集群的类型 lvs-nat &#xff1a; 修改请求报文的目标IP, 多目标 IP 的 DNAT lvs-dr &#xff…

vpp编译安装(Ubuntu 16.04)

1、编译 git clone -b stable/1801 https://github.com/FDio/vpp.git cd vpp ./extras/vagrant/build.sh && make 报错 解决&#xff1a; 操作系统是Ubuntu 18.04.5 换成ubuntu 16即可

step11:打包qml程序

文章目录 0.文章介绍1.增加环境变量2.复制RDU.exe3.找到Qt安装路径4.操作qt 6.4.3&#xff08;minGW&#xff09;命令框 0.文章介绍 1.增加环境变量 电脑里安装了两个版本的QT&#xff0c;最好把现在打包的QT版本环境变量移到最前面 添加完成环境变量之后&#xff0c;再在wi…

力扣高频SQL 50题(基础版)第四十一题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十一题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十一题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…

c++语言学习,isalnum()函数分析

1&#xff1a;isalnum() 函数说明&#xff1a; 检查参数c,是否为英文字母或阿拉伯数字 2&#xff1a;函数原型&#xff1a; int isalnum(int c) 3&#xff1a;函数参数&#xff1a; 参数c&#xff0c;为检测字符 4&#xff1a;返回值&#xff1a; 若参数c为字母或数字&#…

全网最详细教你学习LVS(Linux virual server)

LVS 官网 : http://www.linuxvirtualserver.org/ //&#xff08;可参考&#xff09; 一、LVS定义&#xff1a; 是一个基于 Linux 操作系统的开源软件负载均衡项目。 LVS 主要用于实现服务器的负载均衡和高可用性。它工作在网络的第四层&#xff0c;可以对…

ERP帮助中心的卓越实践:以用友ERP为例的成功之路

引言 在数字化转型的浪潮中&#xff0c;企业资源规划&#xff08;ERP&#xff09;系统作为企业管理的核心工具&#xff0c;其有效应用直接关系到企业的运营效率与竞争力。然而&#xff0c;ERP系统的复杂性和多功能性往往让用户在初识阶段感到困惑。因此&#xff0c;构建一个高…

Boost搜索引擎:网络模块的构建

网页展示界面 每个网页界面都有他相应的代码构成 按F12键 就会出现.html文件代码 上图是csdn当前网页文件代码&#xff0c;所以说要想&#xff0c;设计好看的网页文件需要去学对应的只是&#xff0c;我没有怎么接触过&#xff0c;所以网页代码就不能为大家讲解了。 网页展示的…

软件设计之JavaScript(2)

软件设计之JavaScript(2) 【狂神说Java】JavaScript最新教程通俗易懂 学习内容&#xff1a; 软件开发技能点参照&#xff1a;软件开发&#xff0c;小白变大佬&#xff0c;这套学习路线让你少走弯路是认真的&#xff0c;欢迎讨论 软件开发技能点顺序参照&#xff1a;Java学习…

【鸿蒙开发基础学习】组件导航 (Navigation)

组件导航 (Navigation) Navigation 是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation 组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0c;多端部署场景。通过组件级路由能力…

视频剪辑SDK,人脸美化与滤镜特效,焕发直播新活力

在数字化浪潮席卷全球的今天&#xff0c;直播已成为连接品牌与消费者、创作者与观众的重要桥梁。为了在激烈的直播竞争中脱颖而出&#xff0c;提供高质量、富有创意的直播内容成为关键。美摄科技&#xff0c;作为视频处理技术的先行者&#xff0c;携手其强大的视频剪辑SDK解决方…

Python:构建一个算法预测类型

准确工作&#xff1a;需要下载music.csv 已上传 构建模型内容&#xff1a; import pandas as pd music_data pd.read_csv(music.csv) # music_data Xmusic_data.drop(columns[genre]) # 删除的那一列的名字为genre Ymusic_data[genre] # 访问指定的列 Y 预测用的是决策树&…

leetcode日记(65)组合

一眼递归&#xff0c;第一版写出的代码写成了排列组合&#xff0c;然后修改后&#xff1a; class Solution { public:vector<vector<int>> combine(int n, int k) {vector<int> vec;vector<vector<int>> result;for(int i1;i<n;i){vec.push_…