当前位置: 首页 > news >正文

C++——C++11第三篇

目录

包装器

 function包装器

 bind


 

包装器

 function包装器

 function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。

 上面的程序验证,我们会发现useF函数模板实例化了三份。

包装器可以很好的解决上面的问题 ,让它只实例化成一份

包装器在这个头文件里面std::function在头文件<functional>

template <class Ret, class... Args>
class function<Ret(Args...)>;
模板参数说明:
Ret: 被调用函数的返回类型
Args…:被调用函数的形参

 

 静态成员函数可以直接调用,非静态比较麻烦,这样调用会报错,加取地址符号是语法规定

这里报错是因为成员函数的指针不能直接进行调用,如果要调用则必须用对象去调用

 这样即可正常调用

解决最开始的问题 

包装器例题  力扣

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

 bind

 std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可
调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而
言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M
可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺
序调整等操作。

// 原型如下:
template <class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
// with return type (2)
template <class Ret, class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);

 可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对
象来“适应”原对象的参数列表,bind对参数进行适配。

 如果要直接使用Sub是不行的,我们可以选择多传一个参数或用Bind

 调用bind的一般形式:auto newCallable = bind(callable,arg_list);
其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的
callable的参数。当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中
的参数。
arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示
newCallable的参数,它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对
象中参数的位置:_1为newCallable的第一个参数,_2为第二个参数,以此类推

 

Fn是function 

_1,_2,_3分别代表第一个,第二个和第三个参数,他们定义在placeholders的命名空间中

使用场景

 如果我们就想传参让成员函数和普通函数保持一致,就按照下面方式传参,这时可用bind

这里的作用主要是绑死固定的参数,Sub()被绑死

 1.5被绑死

http://www.lryc.cn/news/16251.html

相关文章:

  • 180 2 22222
  • 成人高考初中毕业能报名吗 需要什么条件
  • ChatGPT初体验
  • ChatGPT概念狂飙!究竟魅力何在?
  • 如何下载阅读Spring源码-全过程详解
  • 学了两个月的Java,最后自己什么也不会,该怎么办?
  • 前端vue实现获取七天时间和星期几功能
  • zookeeper单机部署
  • 单片机输入输出模式
  • 数据结构_ 堆结构与堆排序(c++ 实现 + 完整代码 )
  • 【MySQL】sql中explain解释和应用
  • 从零实现深度学习框架:Seq2Seq从理论到实战【实战篇】
  • 【数据结构入门】-链表之单链表(1)
  • Docker竟如此简单!
  • 在外包干了几年,感觉自己都快费了
  • Java实现多线程有几种方式(满分回答)
  • 实例4:树莓派GPIO控制舵机转动
  • 【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系
  • Linux 环境变量
  • 从功能测试(点点点)到进阶自动化测试,实现薪资翻倍我只用了3个月时间
  • aspnetcore 原生 DI 实现基于 key 的服务获取
  • 华为OD机试 -最大子矩阵和(Python) | 机试题+算法思路+考点+代码解析 【2023】
  • C2驾照科一学习资料(1)
  • 4576: 移动数组元素
  • 字符串中<br>处理
  • 大数据技术原理与应用介绍
  • 【Python】序列与列表(列表元素的增删改查,求之,列表推导式、列表的拷贝)
  • update导致死锁
  • Java 集合 --- 如何遍历Map
  • C#从值类型、引用类型到装箱和拆箱