@@ -314,7 +314,7 @@ int main() {
314
314
315
315
> {{ icon.tip }} 高层封装 API 应当可以完全通过调用底层 API 实现,提供高层 API 只是方便初级用户使用和理解。
316
316
317
- > {{ icon.story }}
317
+ > {{ icon.story }}
318
318
例如 `libcurl` 就提供了 `curl_easy` 和 `curl_multi` 两套 API。
319
319
320
320
- `curl_multi` 提供了超详细的参数,把每个操作分拆成多步,方便用户插手细节,满足高级用户的定制化需求,但太过复杂,难以学习。
@@ -526,6 +526,20 @@ int generic_sum(std::vector<int> const &v, Op op) {
526
526
527
527
> {{ icon.fun }} C++11:auto 只能用于定义变量;C++14:函数返回类型可以是 auto;C++17:模板参数也可以 auto;C++20:函数参数也可以是 auto 了;(狂想)C++47:auto 现在是 C++47 的唯一关键字,用户只需不断输入 auto-auto-auto,编译器内建人工智能自动识别你的意图生成机器码。
528
528
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
+
529
543
### 函数也是对象!
530
544
531
545
在过去的**面向对象编程范式*中,函数(代码)和对象(数据)被*割裂*开来,他们愚昧地认为*函数不是对象**。
@@ -1629,7 +1643,7 @@ auto lambda = [b] (int a) {
1629
1643
1630
1644
``` cpp
1631
1645
int b = 2 ;
1632
- std::function<void (int )> lambda = [b] (int a) {
1646
+ std::function<int (int )> lambda = [b] (int a) {
1633
1647
return a + b;
1634
1648
};
1635
1649
```
@@ -1638,15 +1652,15 @@ std::function<void(int)> lambda = [b] (int a) {
1638
1652
1639
1653
``` cpp
1640
1654
// vector<auto> lambda_list; // 错误:不支持的语法
1641
- vector<function<void (int )>> lambda_list; // OK
1655
+ vector<function<int (int )>> lambda_list; // OK
1642
1656
1643
1657
int b = 2 ;
1644
1658
lambda_list.push_back([b] (int a) {
1645
1659
return a + b;
1646
- };
1660
+ }) ;
1647
1661
lambda_list.push_back([b] (int a) {
1648
1662
return a * b;
1649
- };
1663
+ }) ;
1650
1664
1651
1665
for (auto lambda: lambda_list) {
1652
1666
int ret = lambda(2);
0 commit comments