【C++】function函数对象类型的实现原理 & 偏特化函数类型 & 可变参数
#include <functional>
#include <iostream>
#include <string>
using namespace std;
/*
function 函数类型的实现原理
*/
// 通用类型模板
template <typename Fty>
class myFunction{
};
// 偏特化 R(A1) = Fty
template <typename R,typename A1>
class myFunction<R(A1)>{
public:
// 定义一个函数指针 返回值(*函数指针名)(参数类型)
// typedef R(*PFUNC)(A1);
using PFUNC = R(*)(A1);
myFunction(PFUNC pfunc):_pfunc(pfunc){}
R operator()(A1 arg){
return _pfunc(arg);
}
private:
PFUNC _pfunc;
};
// 指定模板的函数类型 <返回值类型(参数类型)>
template <typename R,typename A1,typename A2>
class myFunction<R(A1,A2)>{
public:
// 定义一个函数指针 返回值(*函数指针名)(参数类型)
// typedef R(*PFUNC)(A1);
using PFUNC = R(*)(A1,A2);
myFunction(PFUNC pfunc):_pfunc(pfunc){}
R operator()(A1 arg1,A2 arg2){
return _pfunc(arg1,arg2);
}
private:
PFUNC _pfunc;
};
void hello(string str){
cout << str << endl;
}
int sum(int a,int b){
cout << "a + b = " << a+b << endl;
return a+b;
}
int main(int, char**){
// 1. 指定函数指针类型 指向函数
myFunction<void(string)> func1 = hello;
// 2. 重载括号运算符 调用
func1("hello world!"); // func1.operator()("hello ...")
myFunction<int(int,int)> func2(sum);
func2(1,2);
}
使用模板类的可变参数 简化
// 偏特化 R(A1) = Fty
template <typename R,typename... A>
class myFunction<R(A...)>{
public:
// 定义一个函数指针 返回值(*函数指针名)(参数类型)
// typedef R(*PFUNC)(A1);
using PFUNC = R(*)(A...);
myFunction(PFUNC pfunc):_pfunc(pfunc){}
R operator()(A... arg){
return _pfunc(arg...);
}
private:
PFUNC _pfunc;
};
typename... A 声明一个模板类型参数包 A
A... 展开类型参数包
(A... arg) 被展开的类型包 A... 修饰的形参包 arg
arg... 展开形参包

浙公网安备 33010602011771号