function+bind实现多态(松耦合)

基类定义虚函数,子类实现虚函数,使用基类指针指向子类对象,从而实现多态,function+bind可以使没有任何关系的各种类对象及其行为以一种相同的行为表现出来,类似多态,高于多态,这里没有继承、没有指针、没有虚函数、松耦合…
将某类对象及其行为包装为模板类function的实例对象,或以模板函数bind将某类对象及其行为包装为模板类function的实例对象,定义包含模板类function的实例对象的Base类,使用Base类可以表现为多态性

元组tuple存储标准库function实例对象( 包装各种类对象及其成员函数 )、解包元组对象,链接点击这里

目录

      • 1、代码中的模板类func及模板函数bind_f是为了理解标准库里的工具库<functional>的包装类function及函数bind,本人所写
      • 2、代码使用标准库的function+bind

1、代码中的模板类func及模板函数bind_f是为了理解标准库里的工具库的包装类function及函数bind,本人所写

#include <iostream>
#include <tuple>  		//元组//std::make_index_sequence< >( )//std::tuple_size<decltype(args)>::value//A类
struct A{void f(int a, int b, double c) { std:: cout <<"A: a + b + c = " << a + b + c << "\n"; } 
};
//B类
struct B{void f(int a, int b) { std:: cout <<"B: a + b = " <<  a + b << "\n"; } 
};//func模板类
template<typename T,typename...Args>
class func{
private:T a;                       //T类型对象void (T::*f)(Args...);	   //T类型对象的成员函数std::tuple<Args...> args;  //保存可变参数//保存T类型对象的成员函数的参数template<size_t...index>   //tuple解包//c++14void tuple_unpack(std::index_sequence<index... > ){ (a.*f)( std::get<index>(args)... ); }
public:	func( const T &a, void(T::*f)(Args...),Args...args ):a(a),f(f), args(args...) {  } //参数为对象、成员函数指针及可变参数的构造函数		void operator()(){ //重载 ()		tuple_unpack( std::make_index_sequence< std::tuple_size<decltype(args)>::value >( ) );} 	
};//bind_f模板函数// 返回func模板类对象
template<typename T,typename...Args>
func<T,Args...> bind_f(const T &a, void(T::*f)(Args...),Args...args ){	return func<T,Args...>(a, f,args... ); //构造一个func对象
} //包含模板类func实例对象的Base类
struct Base{template<typename T>void fun(T&& t){  t();  }
};int main(int, char *[] )
{Base base;A a;B b;//多态性//但A类、B类没有任何关系base.fun( bind_f(a, &A::f,5,9,1.23 ) ); // A类base.fun( bind_f(b, &B::f,5,6 ) );      // B类return 0;
}

2、代码使用标准库的function+bind

#include <iostream>
#include <functional>  	//function + bind//工具类标准库//A类
struct A{void f(int a, int b, double c) { std:: cout <<"A: a + b + c = " << a + b + c << "\n"; } 
};
//B类
struct B{void f(int a, int b) { std:: cout <<"B: a + b = " <<  a + b << "\n"; } 
};//Base类
struct Base{template<typename T>void fun(T&& t){  t();  }
};int main(int, char *[] )
{Base base;A a;B b;//多态性//但A类、B类没有任何关系base.fun( std::bind(&A::f,a, 5,9,1.23 ) ); // A类base.fun( std::bind(&B::f,b, 5,6) );       // B类return 0;
}

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

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

相关文章

前端数据可视化之【Echarts介绍】

目录 &#x1f31f;前言&#x1f31f;丰富的可视化类型&#x1f31f;多种数据格式无需转换直接使用&#x1f31f;移动端优化&#x1f31f;多渲染方案&#xff0c;跨平台使用&#xff01;&#x1f31f;写在最后 &#x1f31f;前言 ECharts开源来自百度商业前端数据可视化团队&a…

力扣每日一题43:字符串相乘

题目描述&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

Python数据分析教程(非常详细)从零基础入门到精通,看完这一篇就够了

1、为什么选择Python进行数据分析? Python是一门动态的、面向对象的脚本语言&#xff0c;同时也是一门简约&#xff0c;通俗易懂的编程语言。Python入门简单&#xff0c;代码可读性强&#xff0c;一段好的Python代码&#xff0c;阅读起来像是在读一篇外语文章。Python这种特性…

ROS键盘遥控机器人,通过参数服务器指定速度

1、引言 在上节的驱动机器人&#xff0c;我们知道是cmd_vel话题发布一串Twist类型消息来控制&#xff0c;我们可以输入如下命令查看这个Twist的详细信息&#xff1a;rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geome…

macos 中ios系统升级,但是macos还是老系统,在手机上无法安装ios软件

https://github.com/filsv/iOSDeviceSupport 构建项目出现 解决的方法&#xff1a; 就可以了&#xff0c;

JDBC-day05(DAO及相关实现类)

七&#xff1a;DAO及相关实现类 1. DAO介绍 DAO&#xff1a;Data Access Object访问数据信息的类和接口&#xff0c;包括了对数据的CRUD&#xff08;Create、Retrival、Update、Delete&#xff09;&#xff0c;而不包含任何业务相关的信息。有时也称作&#xff1a;BaseDAO作用…

关于SparkRdd和SparkSql的几个指标统计,scala语言,打包上传到spark集群,yarn模式运行

需求&#xff1a; ❖ 要求:分别用SparkRDD, SparkSQL两种编程方式完成下列数据分析,结合webUI监控比较性能优劣并给出结果的合理化解释. 1、分别统计用户&#xff0c;性别&#xff0c;职业的个数&#xff1a; 2、查看统计年龄分布情况&#xff08;按照年龄分段为7段&#xff0…

Adobe发布Firefly 2,提升图像质量和用户体验

&#x1f989; AI新闻 &#x1f680; Adobe发布Firefly 2&#xff0c;提升图像质量和用户体验 摘要&#xff1a;Adobe升级了其AIGC生图平台Firefly为Firefly 2&#xff0c;该版本通过引入矢量图生成功能、提升图像质量和增加多项新功能&#xff0c;大幅改善了用户体验。Firef…

太强了!三种方案优化 2000w 数据大表!

目录 评估表数据体量 表容量&#xff1a; 磁盘空间 实例容量 出现问题的原因 如何解决单表数据量太大&#xff0c;查询变慢的问题 方案一&#xff1a;数据表分区 方案二&#xff1a;数据库分表 水平分表 垂直分表 1.取模方案&#xff1a; 2.range 范围方案 3.hash…

C51--基本认知

单片机基本认知&#xff1a; 1、什么是单片机 单片机是一种集成电路芯片。 把具有数据处理能力的中央处理器 CPU、随机存储器RAM、只读存储器ROM。 多种 I / O 口和中断系统、定时器/计数器等功能&#xff08;可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器…

宁夏企业过等保选哪家测评机构好?选哪家堡垒机好?

最近不少宁夏小伙伴在问&#xff0c;宁夏企业过等保选哪家测评机构好&#xff1f;选哪家堡垒机好&#xff1f;今天我们小编就给大家来简单说说哈&#xff01; 宁夏企业过等保选哪家测评机构好&#xff1f; 目前宁夏正规具有资质的等保测评机构只有3家&#xff0c;分别为中电信…

精美的早安问候语,暖心祝福,开心每一天

1、 美好的祝福&#xff0c;成了清晨的主题。相互问候&#xff0c;是一天的开始。让我们伴着不老的岁月&#xff0c;永远开心快乐。早晨好&#xff01; 2、 心宽似海&#xff0c;百福皆来&#xff0c;世事看淡&#xff0c;内心安然。随缘即福&#xff0c;随遇而安&#xff0…

c++ any_of,none_of,all_of

函数 函数作用any_of区间[开始, 结束)中是否至少有一个元素都满足判断式p&#xff0c;只要有一个元素满足条件就返回true&#xff0c;否则返回truenone_of区间[开始, 结束)中是否所有的元素都不满足判断式p&#xff0c;所有的元素都不满足条件返回true&#xff0c;否则返回fal…

银河麒麟你服务x86访问ftp服务器上的文件

打开我的电脑 地址栏输入 ftp地址 可以选择需要的文件复制出来了

简单聊聊低代码

在数字经济迅速发展的背景下&#xff0c;越来越多的企业开始建立健全业务系统、应用、借助数字化工具提升管理效率&#xff0c;驱动业务发展&#xff0c;促进业绩增长。在这一过程中&#xff0c;和许多新技术一样&#xff0c;低代码&#xff08;Low-code&#xff09;开发被推上…

ssh 报错:Permission denied, please try again.

报错问题&#xff1a;执行一条远程scp远程拷贝&#xff0c;在此之前已配置好ssh无密登录&#xff0c; sudo scp -r hadoop-3.2.0 slave2:/usr/local/src/ 确保 /etc/ssh/sshd_config文件下 PasswordAuthentication no 改为 PasswordAuthentication yes 和 PermitRootLogin no …

【Overload游戏引擎细节分析】视图投影矩阵计算与摄像机

本文只罗列公式&#xff0c;不做具体的推导。 OpenGL本身没有摄像机(Camera)的概念&#xff0c;但我们为了产品上的需求与编程上的方便&#xff0c;一般会抽象一个摄像机组件。摄像机类似于人眼&#xff0c;可以建立一个本地坐标系。相机的位置是坐标原点&#xff0c;摄像机的朝…

探秘网页打开的完整过程:DNS解析、CDN加速和Nginx负载均衡的协同驱动

浅谈一个网页打开的全过程&#xff08;涉及DNS、CDN、Nginx负载均衡等&#xff09; 1、概要 从用户在浏览器输入域名开始&#xff0c;到web页面加载完毕&#xff0c;这是一个说复杂不复杂&#xff0c;说简单不简单的过程&#xff0c;下文暂且把这个过程称作网页加载过程。下面…

【08】基础知识:React中收集表单数据(非受控组件和受控组件)

一、概念 非受控组件&#xff1a; 页面中所有输入类的 DOM&#xff0c;现用现取。 给组件绑定 ref 属性&#xff0c;在需要时通过 ref 获取相应值。 受控组件&#xff1a; 页面中所有输入类的 DOM&#xff0c;随着输入&#xff0c;将内容维护到状态 state中&#xff0c;当…

STM32CUBEMX_DMA串口空闲中断接收+接收发送缓冲区

STM32CUBEMX_DMA串口空闲中断接收接收发送缓冲区 前言&#xff1a; 我了解的串口接收指令的方式有&#xff1a;在这里插入图片描述 1、接收数据中断特定帧尾 2、接收数据中断空闲中断 3、DMA接收空闲中断 我最推荐第三种&#xff0c;尤其是数据量比较大且频繁的时候 串口配置 …