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

编程入门 行业动态 更新时间:2024-10-11 21:21:10

function+bind实现<a href=https://www.elefans.com/category/jswz/34/1768225.html style=多态(松耦合)"/>

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;
}

更多推荐

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

本文发布于:2023-12-07 06:49:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1670455.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多态   function   bind

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!