Joe Armstrong说过一句话:
面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个拿着香蕉的大猩猩,和整个丛林。
显然地,这将简单问题复杂化了。我们不否认这个世界上,有些代码是不能简单化的。对于那些可以简单化的代码,我们还是希望不要复杂化。如果你是这样的人,没有理由不使用C++11。下面将展示C++11是如何奇迹般地使代码简单化的。
假设有下面一段代码,用于判断容器内是否存在符合我们要求的字符串:
vector<string>::const_iterator cit = vs.cbegin();
for (; cit != vs.end(); ++cit) {
if (lookForParttern(*cit))
return true;
}
return false;
对于C++11之前, 这段代码在普通不过了。有了C++11,我们很容易写出下面这样的代码:
for (auto cit = vs.cbegin(); cit != vs.end(); ++cit) {
if (lookForParttern(*cit))
return true;
}
return false;
for里面的东西还是放进来比较好,这代码比起之前那段,看起来优雅些了。C++有个range-for,因此我们还可以这样写:
for (auto& x : vs) {
if (lookForParttern(x))
return true;
}
return false;
发现简洁了不少。这还不够,我们还可以使用算法,使代码更简洁:
return find_if(cbegin(vs), cend(vs), lookForParttern) != cend(vs);
很好,变成一行代码了。老实说,cbegin,cend写多了也很烦。我们使用range算法可以消除它:
return find_if(vs, lookForParttern) != cend(vs);
和第一段代码比起来,不仅代码短了很多,可读性也有过之而无不及。C++11在不减少运行效率的情况下,大大提升了生产率。可以把Java,C#扔一边了。