您的位置:首页 > 其它

Lambda 学习笔记 杂感

2006-12-22 09:14 381 查看
今天看了boost中的Lambda,第一映像是丑陋,看了几个例子发现还有点意思,一些实现使用它比起以前的用标准库中的东东来做看起来顺眼的多。完全可以代替functional中那些std::plus之流。不过继续看下去看到Lambda表达式中的控制结构,又觉得很丑陋起来。比起以前的托管C++有得一拼,虽然不习惯C++/CLI的语法,但看起来也比它好多了。当然感觉都是很主观的东西,或许我觉得丑陋单其它人会觉得其美无比。但我想感觉不自然的人会占多数,缺乏语言级的支持支持,使用类库来实现Lambda,写出来的程序可读性真是极差。从个人来说,自己还是希望C++语言中提供Lambda,这样方便很多,再结合C++的标准库,这样使用起来灵活得多,自然得多。
看一段代码,下面是Lambda中if, then, else 语句的样子
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"
#include "boost/lambda/if.hpp"
int main()
{
using namespace boost::lambda;
using namespace std;
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(6);
vec.push_back(5);
vec.push_back(4);

for_each(vec.begin(),vec.end(),if_then_else(
_1 <= 4,
cout << _1 << '/n',
cout << constant("var=")<<_1<<"/n"));

cout<<"/n";

for_each(vec.begin(),vec.end(),
if_(_1 <= 4) [
cout << _1 << "/n"
]
.else_[
cout << constant("var=")<<_1<<"/n"
] );
}
最近正在跟风学习Ruby中 : ),正好那里面也有类似的叫做block的东西,它得到了语言级的支持,下面的代码实现同样的功能
vec = [1, 3, 6, 5, 4]
vec.each do |element|
if element <= 4
puts element
else
puts "var=" + element.to_s
end
end
显然要自然得多,当然在语境上有点不同,数组的each实现可能是这样(摘自《Programming Ruby》)
# within class Array...
def each
for each element
valid Ruby
yield(element)
end
end
自己上面写的do…end那一块代码替换上面的yield调用
希望有一天C++中也可以很自然的用if,else,while,static_cast等关键字来写Lambda表达式,不用像托管C++那样引进一些让人别扭的其它关键字
不过不敢抱太大的希望,标准委员会不肯轻易把某样当作语言特性加入C++,总是说要用C++的人从事的工作是方方面面的,不能因此影响的其他不需要这种特性的人,我们可以以库的形式来代替。这不由得让我想到了木桶的最短木板原则。首先不谈很多东西用库的实现起来很不自然,如lambda表达式,很多东西更本没有相应的库。看了TR1,TR2,里面的东西少得让人失望,98到现在八年了,标准库仍然这么单薄。我需要一个SQL库,可有人却会说C++不适合开发那些简单的数据库应用方面的程序,你可以用XXX语言或XXX语言,本来用C++可以很好的完成工作,由于缺乏某些支持,一大批人奔其它语言去了。或者又人会说你难道自己没有代码积累,自己平时就应该积累一些这样的代码,你也可以使用XXX库,又不一定非要使用标准库。作为一个初学者,我哪去代码积累,使用其它库又可能要忍受学习一些风格相差很大的库的痛苦。
昨天在论坛又看见有人抱怨缺乏框架和类库C++用起来很累了。虽然框架级的复用看起来很强大,但自己已经不对C++引入框架抱希望了,框架是很容易变化的,就像跨平台的GUI库一样,这样易变化又容易引入竞争的东西是不符合C++的精神的。现在只希望C++能丰富一下自己的标准库,让自己不用东拼西凑,使用各种其它库来写程序。如果一个程序又用到Qt写界面,又用到ACE写通信模块,还用到boost提供的一些小组件,写出来的代码真是风格迥异。还好我没有用MFC,而是用的Qt,否则这些代码的风格相差会更大,你或许都不会相信这是用同一门语言写的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: