什么网站可以做PS 写论文兼职,绍兴做网站公司哪家好,网站开发设计体会,常用的小程序开发使用前#xff0c;包头文件#xff1a;#include functional std::function 是 C标准库 中的一个通用函数包装器#xff1b;
它可以储存、复制、调用任何可调用的对象#xff0c;包括#xff1a;函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。
1… 使用前包头文件#include functional std::function 是 C标准库 中的一个通用函数包装器
它可以储存、复制、调用任何可调用的对象包括函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。
1. function 的模板原型
#include functionalfunctionRet(Args...)
// Ret 是被调用函数的返回值类型
// Args... 是被调用函数的形参举一个函数指针的例子讲解
int fun(int a, int b) {return a b;
}int main() {functionint(int, int) func1 fun; // 此处的 fun 本质是 fun() 的函数指针与 fun 无差别// int(, ) : int 为被调用函数的返回值类型// (int, int) : 为被调用函数的形参return 0;
}2. function 的几种使用方法
2.1 函数指针
上面的例子已经展示过了。
2.2 成员函数
class Plus
{
public:static int Plusi(int a, int b) // 静态成员函数{return a b;}double Plusd(double a, double b) // 非静态成员函数{return a b;}
};int main()
{functionint(int, int) func2 Plus::Plusi;cout func2(1, 1) endl;// 非静态成员函数第一个参数为隐藏的 this 指针functiondouble(Plus, double, double) func3 Plus::Plusd; cout func3(Plus(), 1.1, 2.2) endl;return 0;
}2.3 lambda 表达式
int main()
{functionint(int, int) func4 [](int a, int b) { return a b; };return 0;
}2.4 仿函数
struct Fun {int operator()(int a, int b) {return a b;}
};int main()
{functionint(int, int) func5 Fun();return 0;
}3. 包装器解决模板效率低下的问题 将下面的代码运行起来观察 useF() 模板被实例化成了几份 templateclass F, class T
auto useF(F f, T x) // 实际场景中不建议用 auto 推导返回值类型
{static int count 0;cout count: count endl;cout count: count endl;return f(x);
}double f(double x)
{return x / 2;
}struct Fun
{double operator()(double x){return x / 3;}
};int main()
{auto f1 [](double x) { return x / 4; };cout useF(f1, 11.11) endl;cout useF(f, 11.11) endl;cout useF(Fun(), 11.11) endl;return 0;
}从运行结果中可以看出 count 始终为 1 且每一个 count 的地址都不相同。事实上useF() 被实例化成了三份。
我们可以利用包装器解决模板效率低下的问题。 functiondouble(double) func1 f1;cout useF(func1, 11.11) endl endl;functiondouble(double) func2 f;cout useF(func2, 11.11) endl endl;functiondouble(double) func3 Fun();cout useF(func2, 11.11) endl endl;为什么通过 std::function 包装后useF() 只会实例化出一份呢 不妨通过 typeid 观察 func1、func2、func3 的类型。