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

C++11:包装器

目录

1.function包装器

2.bind包装器


1.function包装器

        C++是面向对象的一门语言,因此为了封装函数,也出现了仿函数,便于传参使用。C++11新增了lambda表达式,进一步提高编程者的效率。但是,C语言的函数指针、C++98的仿函数、C++11的lambda表达式都存在一些弊端:

函数指针void(*pf)()类型复杂,不便于阅读书写
仿函数不同的类,类型不同
lambda表达式语法层没有返回类型

            比如这部分代,有一个函数模板,分别用不同的形式去传参,模板实例化的useF是有三种

template<class F,class T>
T useF(F fun, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "------------" << endl;return fun(x);
}
//回调函数
double f(double i)
{return i / 2;
}
//仿函数
struct Functor
{double operator()(double d){return d / 3;}
};
int main()
{//函数指针cout << useF(f, 11.11) << endl;//仿函数cout << useF(Functor(), 11.11) << endl;//lambda表达式cout << useF([](double d)->double {return d / 4; }, 11.11) << endl;return 0;
}

        C++11为了统一类型,对这一层进行了封装,即包装器。


        C++的头文件<functional>中存在类模板function

 

         

模板参数说明:
Ret: 被调用函数的返回类型
Args…:被调用函数的形参

        有了包装器,对上面的语法修改:

int main()
{//函数指针function<double(double)> func1 = f;//这一层用包装器cout << useF(func1, 11.11) << endl;//此时useF的第一个参数都是function类型//仿函数function<double(double)> func2 = Functor();cout << useF(func2, 11.11) << endl;//lambda表达式function<double(double)> func3 = [](double d)->double {return d / 4; };cout << useF(func3, 11.11) << endl;return 0;
}

        特殊情况用包装器封装类中的成员函数。

int main()
{// 普通函数function<int(int, int)> fc1 = f;cout << fc1(1, 1) << endl;// 静态成员函数function<int(int, int)> fc2 = Plus::plusi;cout << fc2(1, 1) << endl;// 因为this指针导致参数不匹配,非静态成员函数需要对象的指针或者对象去进行调用/*第一种写法:Plus plus;function<double(Plus*, double, double)> fc3 = &Plus::plusd;cout << fc3(&plus, 1, 1) << endl;*///第二种写法function<double(Plus, double, double)> fc3 = &Plus::plusd;cout << fc3(Plus(), 1, 1) << endl;return 0;
}

2.bind包装器

        bind是定义在C++头文件<functional>中的函数模板

 

        使用bind一般可以调整函数参数的顺序或者调整个数。 调整个数的场景居多,拿这个举例。

实现的大致方法是用特定的顺序绑定参数。

在C++的头文件<functional>中封装了一个命名空间placeholders

        _1、_2、_3·····就是用来绑定参数的标识符。

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<double(double, double)> fc4 = bind(&Plus::plusd, Plus(), placeholders::_1, placeholders::_2);cout << fc4(2, 3) << endl;function<double(double)> fc5 = bind(&Plus::plusd, Plus(), placeholders::_1, 20);cout << fc5(2) << endl;return 0;
}

         bind的第一个参数,是函数名,这里由于是成员函数,要加&取地址符(语法规定)。剩下的参数都是属于参数包的,由于this指针,这里第二个参数对应plusd隐藏的第一个参数。_1绑定plusd的a,_2绑定b。

        

        也可以只绑定a,就是用_1来绑定,语法上要对应在正确的位置。 调用时,因为部分参数已经被绑定,因此明显减少了需要传递的参数:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 多线程练习2 (抽奖比较Runnable写法)
  • 【Qt】 编辑框 | 按钮 的 初步了解
  • potplayer播放m2ts格式,截图
  • [python][代码]定义了一个用于AES加密和解密的工具类
  • 快速批量替换图片名称为指定名称(附代码)
  • 我是如何克服编程学习中的挫折感的
  • uniapp在线下载安装包更新app
  • 有哪些适合中小企业的六西格玛培训课程?
  • 规范化JavaBean
  • poi-tl循环放图片+文字说明
  • dm 到 dm 的 HS 同步部署
  • 入门request请求库使用
  • 5.1、生成树协议stp
  • 【ubuntu24.04】docker pull 配置
  • leetcode_62. 不同路径 + 63. 不同路径 II
  • 自己简单写的 事件订阅机制
  • 《Java编程思想》读书笔记-对象导论
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Cookie 在前端中的实践
  • input实现文字超出省略号功能
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • PHP的Ev教程三(Periodic watcher)
  • React系列之 Redux 架构模式
  • Spring Boot MyBatis配置多种数据库
  • Swoft 源码剖析 - 代码自动更新机制
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 给初学者:JavaScript 中数组操作注意点
  • 记一次删除Git记录中的大文件的过程
  • 技术:超级实用的电脑小技巧
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小试R空间处理新库sf
  • 自定义函数
  • ionic入门之数据绑定显示-1
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 达梦数据库知识点
  • #define用法
  • #HarmonyOS:基础语法
  • (02)vite环境变量配置
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (11)MSP430F5529 定时器B
  • (2022 CVPR) Unbiased Teacher v2
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (学习日记)2024.01.19
  • (转)【Hibernate总结系列】使用举例
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (自用)仿写程序
  • ****三次握手和四次挥手
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法