可变参数模板、可变参数存储为元组tuple、元组解包为函数参数(C++14标准)

之前,写了 对象与成员函数指针 function+bind,没有涉及成员函数的参数传递
本文利用可变参数传参,可变参数存储为tuple,tuple解包为成员函数的参数来实现

#include <iostream>
#include <tuple>  		//元组
						//std::make_index_sequence< >( )
						//std::tuple_size::value
 //A类
struct A{
	void f1(int a, int b){  std:: cout << a + b << " ";  }	   //f1
	void f2(int a, int b, double c) { std:: cout << a +b +c; } //f2
};

//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对象
} 

int main(int, char *[] )
{
	A a;
	func<A,int,int> t1 = bind_f(a, &A::f1,5,9 ); //A类对象与A类的任一成员函数绑定//返回func类对象
	t1( );	 
	func<A,int,int,double> t2 = bind_f(a, &A::f2,5,9,1.23 ); 
	t2( );	
	return 0;
}

你可能感兴趣的:(C++,c++,开发语言)