@@ -314,7 +314,7 @@ int main() {
314314
315315> {{ icon.tip }} 高层封装 API 应当可以完全通过调用底层 API 实现,提供高层 API 只是方便初级用户使用和理解。
316316
317- > {{ icon.story }}
317+ > {{ icon.story }}
318318 例如 `libcurl` 就提供了 `curl_easy` 和 `curl_multi` 两套 API。
319319
320320 - `curl_multi` 提供了超详细的参数,把每个操作分拆成多步,方便用户插手细节,满足高级用户的定制化需求,但太过复杂,难以学习。
@@ -526,6 +526,20 @@ int generic_sum(std::vector<int> const &v, Op op) {
526526
527527> {{ icon.fun }} C++11:auto 只能用于定义变量;C++14:函数返回类型可以是 auto;C++17:模板参数也可以 auto;C++20:函数参数也可以是 auto 了;(狂想)C++47:auto 现在是 C++47 的唯一关键字,用户只需不断输入 auto-auto-auto,编译器内建人工智能自动识别你的意图生成机器码。
528528
529+ 使用模板调用时,通常需要指定模板参数 ` Op ` 的类型:
530+
531+ ``` cpp
532+ generic_sum<std::function<int (int , int )>>(a, add);
533+ ```
534+
535+ ` std::function<int(int, int)> ` 是什么鬼画符?别担心小彭老师会在下文讲解 ` function ` 这个容器。这里可以简单理解为这是一个接受两个 ` int ` 类型的参数,返回值也是 ` int ` 类型的函数容器,容纳 ` add ` 这个函数。不过也可以让编译器去自动推导模板参数:
536+
537+ ``` cpp
538+ generic_sum (a, add);
539+ ```
540+
541+ 这和上面的代码是等价的。
542+
529543### 函数也是对象!
530544
531545在过去的**面向对象编程范式*中,函数(代码)和对象(数据)被*割裂*开来,他们愚昧地认为*函数不是对象**。
@@ -1629,7 +1643,7 @@ auto lambda = [b] (int a) {
16291643
16301644``` cpp
16311645int b = 2 ;
1632- std::function<void (int )> lambda = [b] (int a) {
1646+ std::function<int (int )> lambda = [b] (int a) {
16331647 return a + b;
16341648};
16351649```
@@ -1638,15 +1652,15 @@ std::function<void(int)> lambda = [b] (int a) {
16381652
16391653``` cpp
16401654// vector<auto> lambda_list; // 错误:不支持的语法
1641- vector<function<void (int )>> lambda_list; // OK
1655+ vector<function<int (int )>> lambda_list; // OK
16421656
16431657int b = 2 ;
16441658lambda_list.push_back([b] (int a) {
16451659 return a + b;
1646- };
1660+ }) ;
16471661lambda_list.push_back([b] (int a) {
16481662 return a * b;
1649- };
1663+ }) ;
16501664
16511665for (auto lambda: lambda_list) {
16521666 int ret = lambda(2);
0 commit comments