1 解决什么问题
主要是为函数提供了一种容器,将函数当做对象来使用。
2 基本用法
采用function需要包含头文件 #include <functional.h>
int test(int n){ return n; } test(1); 等价于 std::function<int(int)> f = test; f(123);
3 C++支持四种函数的封装
1 普通函数 2 匿名函数 3 类的成员函数 4仿函数
对于普通函数上面的用法就是普通函数。
<font size="3" color="blue">匿名函数</font> std::functional<int(int)> f2 = [](int n) -> int { //函数体 }; 调用 f2(123);
类的成员函数
class Ctest{ public: int test(int){ //业务处理 }; }; std::functional<int(CTest*, int)> f3 = &CTest::test; CTest t; f3(&t, 123);
经常容易出错的是不要CTest。
仿函数
重载了()运算符的函数叫仿函数。
CTest { public: int operator()(int n){ //业务处理 } }; CTest t; t(1234); 等价于 std::functional<int(CTest*, int) f4= &CTest::operator(); CTest t; f4(&t, 1234);
4 bind机制
对于function来说是将函数当成对象来使用,而bind机制是将函数参数和函数绑定在一起当成对象来使用。
基本用法:
int test(int a, int b, int c){ //业务处理 };
实现一个函数参数可能比较多。
auto a = std::bind(test, 1,2,3);
test(函数)+参数绑定在一起称为一个对象来使用
调用: a() 当成给一个对象使用
当然对于后面的参数1,2,3,也可以采用站位符号来使用。例如
auto f2 = std::bind(test, 1, std::placeholders::_1, 3); f2(2); 或者 auto f2 = std::bind(test, std::placeholders_2, std::placeholders::_1, 3);
f2(1,2); //1对于站位符std::placeholders::_1