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

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

将某类对象及其行为包装为模板类function的实例对象,或以模板函数bind将某类对象及其行为包装为模板类function的实例对象,定义包含模板类function的实例对象的Base类,使用Base类可以表现为多态性

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

目录

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

javascript 复制代码
#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++14
	void 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

javascript 复制代码
#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;
}
相关推荐
RuoZoe1 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++
鱼子星_3 小时前
【C++】继承和多态(上)
c++·笔记
郝学胜-神的一滴4 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
码匠许师傅4 小时前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
爱吃巧克力的程序媛7 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.7 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
键盘会跳舞8 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
HugoStudio_SWAN9 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪
jimy19 小时前
C++ 的 “移动语义”——Move Semantics
开发语言·c++
励志不掉头发的内向程序员11 小时前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互