基类定义虚函数,子类实现虚函数,使用基类指针指向子类对象,从而实现多态,function+bind可以使没有任何关系的各种类对象及其行为以一种相同的行为表现出来,类似多态,高于多态,这里没有继承、没有指针、没有虚函数、松耦合…
将某类对象及其行为包装为模板类function的实例对象,或以模板函数bind将某类对象及其行为包装为模板类function的实例对象,定义包含模板类function的实例对象的Base类,使用Base类可以表现为多态性
元组tuple存储标准库function实例对象( 包装各种类对象及其成员函数 )、解包元组对象,链接点击这里
#include <iostream>
#include <tuple> //元组
//std::make_index_sequence< >( )
//std::tuple_size::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;
}
#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;
}