类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。

通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用 模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以隐式地转换为std::function

自己实现function

#include #include using namespace std;templateclass MyFunction3 {};templateclass MyFunction3 {public:typedef Ty(*pFunction)(A1);//定义一个函数指针,指针指向的函数返回类型是Ty,有1个函数参数MyFunction3(pFunction _pFunction) : _function(_pFunction) {}Ty operator()(A1 arg1) {return (*_function)(arg1);}private:pFunction _function;};templateclass MyFunction3 {public:typedef Ty(*pFunction)(A1, A2);//定义一个函数指针,指针指向的函数返回类型是Ty,有两个函数参数MyFunction3(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 f1(sum1);f1(20,30);MyFunction3 f2(showMes);f2("AAAA");system("pause");return 0;}

上面代码我们实现了两个模板的部分特例化
class MyFunction3 一个函数参数的
class MyFunction3 两个函数参数的

所以问题来了…三个参数,四个参数,五个参数等若干个参数的怎么办?

可以使用C++11 可变参数类型, 具体如下

#include #include using namespace std;templateclass MyFunction4 {};templateclass MyFunction4 {public:typedef R(*PFUNCTION)(A...);MyFunction4(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 f1(sum11);f1(20, 30);MyFunction4 f2(showMes1);f2("AAAA");system("pause");return 0;}