C++中function的实现原理详解
短信预约 -IT技能 免费直播动态提醒
前言
类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。
通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用 模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以隐式地转换为std::function
自己实现function
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class MyFunction3 {
};
template<typename Ty, typename A1>
class MyFunction3<Ty(A1)> {
public:
typedef Ty(*pFunction)(A1);//定义一个函数指针,指针指向的函数返回类型是Ty,有1个函数参数
MyFunction3<Ty(A1)>(pFunction _pFunction) : _function(_pFunction) {
}
Ty operator()(A1 arg1) {
return (*_function)(arg1);
}
private:
pFunction _function;
};
template<typename Ty,typename A1,typename A2>
class MyFunction3<Ty(A1,A2)> {
public:
typedef Ty(*pFunction)(A1, A2);//定义一个函数指针,指针指向的函数返回类型是Ty,有两个函数参数
MyFunction3<Ty(A1, A2)>(pFunction _pFunction):_function(_pFunction) {
}
Ty operator()(A1 arg1, A2 arg2) {
return (*_function)(arg1, arg2);
}
private:
pFunction _function;
};
void showMes(string mes) {
cout << "showMes(string mes)=" << mes << endl;
}
int sum1(int x, int y) {
cout << "sum1 "<<(x+y) << endl;
return x + y;
}
int sum2(int x, int y) {
cout << "sum2 " << (x + y) << endl;
return x + y;
}
int main() {
MyFunction3<int(int, int)> f1(sum1);
f1(20,30);
MyFunction3<void(string)> f2(showMes);
f2("AAAA");
system("pause");
return 0;
}
上面代码我们实现了两个模板的部分特例化
- class MyFunction3<Ty(A1)> 一个函数参数的
- class MyFunction3<Ty(A1,A2)> 两个函数参数的
所以问题来了...三个参数,四个参数,五个参数等若干个参数的怎么办?
可以使用C++11 可变参数类型, 具体如下
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class MyFunction4 {
};
template<typename R , typename... A >
class MyFunction4<R(A...)> {
public:
typedef R(*PFUNCTION)(A...);
MyFunction4<R(A...)>(PFUNCTION _p) : function(_p) {}
R operator()(A... arg) {
return (*function)(arg...);
}
private:
PFUNCTION function;
};
void showMes1(string mes) {
cout << "showMes(string mes)=" << mes << endl;
}
int sum11(int x, int y) {
cout << "sum11 " << (x + y) << endl;
return x + y;
}
int sum21(int x, int y) {
cout << "sum21 " << (x + y) << endl;
return x + y;
}
int main() {
MyFunction4<int(int, int)> f1(sum11);
f1(20, 30);
MyFunction4<void(string)> f2(showMes1);
f2("AAAA");
system("pause");
return 0;
}
到此这篇关于C++中function的实现原理详解的文章就介绍到这了,更多相关C++ function原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341