title: 8.6.14 函数式编程 tags: notebook: 8.0 工作准备
函数式编程
- 仿函数等等都是可调用对象
- 和C的函数指针区分开了
一、 函数指针
C++11 定义函数指针
推荐使用关键字:
- auto
- function<>
- <> 内为函数的类型
// 一个函数
void HelloWorld() {
std::cout << "Hello world";
}
一个函数的类型
- 由返回值 和 传参 组成
auto
会用remove_ 去掉引用和const
decltype
也可以,传入函数地址
二、闭包
什么是闭包
定义:
- 带有上下文的函数
- 上下文:上下作用域有信息
- 就是有状态的函数:仿函数,一个类。
- 一个函数,带上了状态,就成了闭包
- 状态:有属于自己的变量。
闭包
- 使用类重载()运算符定义含糊对象
- 使用C++11标准引入的bind函数实现闭包
- 使用C++1标准引入的lambda表达式实现闭包
三、 lambda
功能强大的函数
在运行时绑定的
[capture](parameters) mutable return-type{ statement }
- capture:捕获,使用父作用域的变量
- [var] 值传递捕获变量
- [=] 所有父作用域的变量,导致效率下降
- [&var] 引用传递捕获变量
- [&] 引用传递,可能在调用时对象已经被释放
- [this] 不能修改this指针
- parameters: 形参,调用时传入
- mutable:可选字段,加上则可对捕获参数进行修改
- return-type:可以不带,自动推导类型
- capture:捕获,使用父作用域的变量
#include <iostream>
#include <functional>
using namespace std;
auto functionA = [](int n) {
cout << "functionA = " << n << endl;
};
auto functionB = [](int n) {
functionA(n);
};
class Data{
int _a, _b;
public:
Data(int a, int b): _a(a),_b(b) {
}
using type_value = int;
void operator()(function<int(int, int)> f) {
cout << f(_a, _b) << endl;
}
};
auto Data2 = [](int a, int b) {
// 引用传递不可:出了括号内存被释放
return [=](function<int(int, int)> func) {
cout << func(a, b) << endl;
};
};
auto add = [](int a, int b) {return a + b;};
auto sub = [](int a, int b) {return a - b;};
int main(int argc, char const *argv[]) {
auto f = Data2(1, 2);
f(add);
return 0;
}