C++11 改变生活的几个细节

C++11 提供了一些便利的语法, 不一定能改变世界, 但是真的改变了 C++ coder 的生活. 然后 C++ coder 占据了程序员的很大一部分, 所以 C++11 这些便利的语法, 也间接地改变了世界.

 

排名第一: lambda expression.

      第二: range-based for loop.

      第三: initializer list.

      第四: user-defined literal

 

注:

1. 排名是我自己排的.

2. 下文所说的 "传统 C++" 一般指 C++03, 以及更老的 C++ 标准.

 


 

 

lambda expression

曾几何时, 我们总是要为 find_if, transform, accumulate 等泛型函数书写着各种 function 和 functor:

我们需要给不同的 function 和 funtor 起名字, 并不断重复的写着类似含义的 "查找" 函数. 真是 tedious 至极.

来看看 C++11 是如何做的:

我只想说: Perfect!

 

range-based for loop

曾几何时, 我们不断地书写着各种 for (int i = 0; i < xxx; ++i); 各种 for (vector<int>::const_iterator it = xxx.begin(); it != xx.end(); ++it); 这些太常用, 但却又太长了.

来看看 C++11 做了些什么吧:

一眼就能看出, 对于 coder 来说, 类型是明显的, 而传统 C++ 却需要我们明确的写在代码里. 这导致代码臃肿, 累赘. 而 11 则在允许把这部分 redundant 工作交给编译器, 解脱了写代码和看代码的程序员.

 

initializer list

曾几何时, 我们书写着无数种初始化 STL 容器的代码:

 

这些代码无论从书写速度和直观程度, 都让人咋舌, 那么 C++11 是如何做的呢? 来看下面的代码:

这种初始化列表的方式, 和传统 C/C++ 的数组初始化保持风格一致, 而且对于小规模直接初始化, 使代码一目了然, 使用起来甚是舒心.

 

user-defined literal

曾几何时, 我总是把二进制的数字全写成十六进制进行运算, 方便理解和修改:

但是一眼看上去, `Machine | 0x0000000N` 这样的语法, 既不直观, 而且 `1, 2, 4, 8` 这样的数字也不连续, 很容易写错造成 bug. 不如写成这样直观:

这样一眼看上去就知道哪个 bit 代表哪个值, 无论对于记忆还是今后调试, 都非常有好处.

再来看一个更适合 user-defined literal 的应用:

上述代码, `KG2G(3) + 500 + N2G(980);` 不断地通过函数调用转换为 "g(质量单位: 克)" 从而统一单位进行运算. 这行代码如果非你亲手所写, 或者没有注释, 那么读起来真是一下子不知道在干什么. 那么再来看看 C++11 是怎么解决的:

同样的代码, 没有更多的注释, 这样看来着实是清晰了很多, `3 kg + 500 g + 980 n(牛顿)`. 就像读书一样, 见文知意.

 


 

心得体会:

  C++ 11 向 "简单的事情繁琐的步骤" 说 "不!". 这一点通过 lambda expression, initializer list, range-based for loop 体现的最明显: 简单的语法胜任简单的任务. 如果任务复杂, 则还需要传统的, 复杂的语法形式完成任务. 比如下面的例子:

注释写的很清楚了, 请读者体会.

 

我之前还写了一篇关于 C++11 faq 的笔记, 在这里: http://www.cnblogs.com/walfud/articles/2846227.html

 

posted @ 2013-08-25 17:38  walfud  阅读(1158)  评论(0编辑  收藏  举报