04 April 2022

C++ 核心指南目录

理由:

提取公用代码,可以提高代码可读性和重用性,避免代码太复杂导致的错误。如果有些操作已经明确定义了,可以将其从代码中提取出来,起一个有意义的函数名。

错误例子:

void read_and_print(istream& is)    // read and print an int
{
    int x;
    if (is >> x)
        cout << "the int is " << x << '\n';
    else
        cerr << "no int on input\n";
}

read_and_print 函数几乎全错了。输出到一个固定的输出流、只处理 int 类型,不可重用,逻辑上不相关的操作混在一起,局部变量在作用域范围外使用。

如果一个 lambda 需要在多处使用,可以给把它赋值给一个变量:

sort(a, b, [](T x, T y) { return x.rank() < y.rank() && x.value() < y.value();});

auto lessT = [](T x, T y) { return x.rank() < y.rank() && x.value() < y.value();};

sort(a, b, lessT);
find_if(a, b, lessT);

最短的代码,不一定是性能最好、最易维护的代码。

例外:

  • 循环体中的代码很少会重用。循环体要保持尽量短。
  • 同样的,回调函数也很少重用。

强化:

  • 保持代码简短
  • 标注代码中相似的 lambda 函数,可能可以给 lambda 命名,从而可以在别处重用