for_each
的负面心得. 我对这个东西在当前 C++ 语法下约束是否能广泛使用持有怀疑态度, 至于能否替代所有的 for
循环, 我持完全否定观点! 如果您发现文中提及的这档子事情本质上是我不了解 STL
而自寻死路, 请不吝赐教, 在下方回复, 在下感激不尽.在 Google 中输入
"for_each"
然后猛击 "I’m feeling lucky", 这时我幸运地跳转到大名鼎鼎的 sgi 的网站里, 页面中有个例子template<class T> struct print : public unary_function<T, void>
{
print(ostream& out) : os(out), count(0) {}
void operator() (T x) { os << x << ' '; ++count; }
ostream& os;
int count;
};
int main()
{
int A[] = {1, 4, 2, 8, 5, 7};
const int N = sizeof(A) / sizeof(int);
print<int> P = for_each(A, A + N, print<int>(cout));
cout << endl << P.count << " objects printed." << endl;
}
for_each
的用法. 从此泛型党成了大赢家, 除了 for_each
内部, 外面的代码再也不需要 for
这个关键字了.而那些说写 C++ 代码像谈话一样简短, 基本上泛型编程完全不及格的程序员, 在写上面功能的时候一般会这样做
int main()
{
int A[] = {1, 4, 2, 8, 5, 7};
const int N = sizeof(A) / sizeof(int);
int i;
for (i = 0; i < N; ++i)
cout << A[i] << ' ';
cout << endl << i << " objects printed." << endl;
}
for_each
之后, 我完全丧失了当初的激情, 变得极其懒惰, 不愿意把简单的操作抽取到函数外部构造成一个对象然后传递给 for_each
; 在维护自己以前写的代码时, 也会偷偷把 for_each
改回 for
循环, 因为有的时候我实在不知道伙伴们把我弄出来的那个函数对象类型给维护到哪里去了.当然, 我并不认为这是
for_each
, 或者 STL, 或者泛型的错. 在我心目中, 泛型思想是风骚的, for_each
的设计是超前的, 问题出在 C++ 语法这个悲剧帝身上, 或者说, 硬要用 C++ 这个传统的面向过程加面向对象语言的语法来包装对象, 来实现类似高阶函数这种函数式编程中的特性, 是悲剧的根源所在. 不仅是 for_each
, 连 find_if
等类似的 STL 函数都差不多一样的下场, 与其构造一个精妙绝伦的函数对象类型, 程序员还不如老老实实写个破循环来得实在.一个振奋人心的消息是, C++ 新标准即将发布了, 它会支持闭包对象, 那样的话,
for_each
以及其它函数就不会像现在这么处境尴尬了.