C++ Primer Chapter 14-3

来源:互联网 发布:mysql mac 安装包下载 编辑:程序博客网 时间:2024/06/05 04:30
1:函数对象常常作为泛型算法的实参(操作方法),就像 lambda 一样,可以重载泛型算法中的默认操作。自己重新定义一种操作。

2:lambda 其实是一个函数对象编译器会把 lambda 翻译成一个未命名的函数类对象。其重载了函数调用运算符,且为一个 const 的函数。如果捕获列表有数据的话,那么该类就会有对应个数的数据成员,也因此该类没有默认构造函数。有没有拷贝控制析构函数具体看捕获数据类型

3:标准库中定义了一组表示算术运算符关系运算符逻辑运算符函数对象,他们都是模板类。可以定义一个对应类型的函数对象,然后用该对象去执行算术运算,关系运算等等。详见 page510,而且该函数对象参数个数为运算符运算对象的个数

4:标准库中的函数对象可以比较指针的大小。

5:关联容器中的元素都是利用标准库中 less 函数对象来排序的。

6:C++中的可调用对象有:函数函数指针函数对象(重载了调用运算符的类的对象),lambda 表达式bind创建的对象。

7:不同调用对象可能具有相同调用形式,相同的调用形式是指:具有相同的返回类型相同实参个数类型。如 int(int, int)这种

8:函数表:用于存储指向这些调用对象的 “指针” ,函数表可以用 map 来实现。构建一个运算符的 string 关键字 到 对应的函数形式(这里是指针)表。比如:
  1. map<string, int(*)(int, int)// 只能存储该类函数指针。
定义了一种 string 到调用形式为 int (*)(int, int) 的函数表。但是该同一个函数表中的调用类型必须相同

9:为了解决以上函数表定义不可以存储具有相同的调用形式不同调用的类型的问题,标准库中定义了 function 模板类,可以存储具有相同的调用形式所有调用类型

10:function 是模板,那么就要指出类型,该类型代表的是调用形式,比如
  1. function<int(int,int)> f; 
  2. // 表示定义一个可以存储调用形式为 int(int,int) 的所有调用对象
  3. // 在这里没有存储,是一个空的 function 对象
11:
  1. function<int(int,int)> f = add;
  2. function<int(int,int)> f1 = divide();
  3. function<int(int,int)> f2 = [](int,int)->int{};
这里 就是一个函数指针 f1 是一个函数对象f2 是一个 lambda 表达式。但是他们都具有相同的调用形式。

12:这样通过 以上分析就可以通过 funtion<int(int,int)> 这种类型来定义函数表。
  1. map<string,function<int(int,int)>>
这样我们就可以定义函数调用形式相同的所有函数调用类型。其实就相当于我们抽象出来一个函数调用形式类型,只要具有相同调用形式的类型都是同一种类型。function 屏蔽了底层实现不同性。


0 0
原创粉丝点击