﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-沐枫小筑</title><link>http://www.cnblogs.com/ly4cn/</link><description>script c c++ c++/cli c# 
.net windows ria game and so ...</description><language>zh-cn</language><lastBuildDate>Sat, 11 Oct 2008 23:21:27 GMT</lastBuildDate><pubDate>Sat, 11 Oct 2008 23:21:27 GMT</pubDate><ttl>60</ttl><item><title>推荐一个不错的flex ajax javascript资源网站</title><link>http://www.cnblogs.com/ly4cn/archive/2008/08/26/1276458.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Tue, 26 Aug 2008 02:39:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2008/08/26/1276458.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/1276458.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2008/08/26/1276458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/1276458.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/1276458.html</trackback:ping><description><![CDATA[<p>推荐一个不错的flex ajax javascript资源网站</p>
<p>http://ntt.cc/</p>
<p>有实例有源码，包含内容有flash, flex, ajax, javascript等ria应用的许多不错的效果和功能。</p><img src ="http://www.cnblogs.com/ly4cn/aggbug/1276458.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42945/" target="_blank">[新闻]Google股价跌破329美元 61%员工期权价值归零</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>.net winform 的 OnKeyDown 与 方向键</title><link>http://www.cnblogs.com/ly4cn/archive/2008/08/18/1270410.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Mon, 18 Aug 2008 08:13:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2008/08/18/1270410.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/1270410.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2008/08/18/1270410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/1270410.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/1270410.html</trackback:ping><description><![CDATA[<p>　　随手写了一个小程序，突然遇到一个问题：</p>
<p>　　在自定义的控件中，override了一个OnKeyDown，用于处理方向键。结果，无效，跟踪调试发现，方向键无法进入函数断点，但其它如数字字母等键可以。</p>
<p>　　上网查了一下，发现不少人遇到同样的问题。不过不是在自定义控件中，是在窗体中。当然，解决的方法很简单，设置KeyPreview为true就可以了。<br />
</p>
<p>　　自宝义控件可没有KeyPreview属性。<br />
</p>
<p>　　为什么方向键会这么特殊？很简单，原来，方向键、制表键(Tab)等用于窗体中的各个子控件的焦点切换，因此在OnKeyDown之前就被截获并处理掉了。<br />
</p>
<p>　　知道原因了，解决起来就好办了：</p>
<p>　　在自定义控件中如需要处理方向键，应该override OnPreviewKeyDown/OnPreviewKeyUp等弊病数就可以了。<br />
</p><img src ="http://www.cnblogs.com/ly4cn/aggbug/1270410.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42944/" target="_blank">[新闻]十年祭:昔日明星软件今何在?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>MySQL 5.1 无法创建、修改存储过程的解决（简单问题）</title><link>http://www.cnblogs.com/ly4cn/archive/2008/04/22/1165528.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Tue, 22 Apr 2008 06:05:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2008/04/22/1165528.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/1165528.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2008/04/22/1165528.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/1165528.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/1165528.html</trackback:ping><description><![CDATA[刚开始用MySQL 5.1，就遇到无法创建、修改存储过程。<br />
尝试无果，上网搜索，居然简单就解决了：<br />
<br />
网友<a target="_blank" href="http://hi.csdn.net/dracoo">dracoo</a>提供答案：<br />
问题就出在你用了新版的MySQL <br />
在建立存储过程前加上这个命令吧。 <br />
SET&nbsp;sql_mode&nbsp;=&nbsp;'';<br />
<br />
为了省事，我直接把MySQL的服务器参数sql_mode去掉了。然后一切正常。<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/1165528.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42943/" target="_blank">[新闻]六大可能出售IT企业名单：SUN领头或被猎走</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>一个稍微好用些的 svn 服务器</title><link>http://www.cnblogs.com/ly4cn/archive/2007/12/15/SVN.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sat, 15 Dec 2007 10:31:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/12/15/SVN.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/996125.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/12/15/SVN.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/996125.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/996125.html</trackback:ping><description><![CDATA[今天安装svn服务器。上官网下载，发现windows下有一个稍微好用些的svn服务器。<br />
下载地址： http://www.visualsvn.com/server/<br />
<br />
这个东西有几个特色：<br />
1. 安装和配置过程很方便（最大优点之一）<br />
2. 自带apache/ssl/mod_dav_svn/...等模块，既小巧，又简单，也安全一些。<br />
3. 自带MSC管理工具，可以创建用户、用户组，还可以管理多个源码库，以及配置各个路径的访问权限（最大优点之二）<br />
<br />
通过上面下载地址，可以看到截图。不过，截图的版本稍低点。目前的版本是1.01。核心是Svn1.45，与官方同步。其实它也是为官方提供windows移植版的网站之一。<br />
<br />
需要注意的是，这个网站提供的VisualSVN Server是免费的，而客户端VisualSVN是收费的。我们可以不用该客户端，客户端还是用TortoiseSVN/AkuhSVN之类的。VisualSVN客户端从介绍上看，与AnkhSVN是差不多的，只不过功能上略有优点。定价是$49。<br />
<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/996125.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42942/" target="_blank">[新闻]Linux内核2.6.27正式到来</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>VC中的一个很奇怪的问题－－关于C4244</title><link>http://www.cnblogs.com/ly4cn/archive/2007/11/30/978144.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Fri, 30 Nov 2007 04:48:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/11/30/978144.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/978144.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/11/30/978144.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/978144.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/978144.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 从VC2003到VC2005，一直有一个很奇怪的问题。<br />
&nbsp;&nbsp;&nbsp; 如下的代码：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">short</span><span style="color: rgb(0, 0, 0);">&nbsp;s1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">short</span><span style="color: rgb(0, 0, 0);">&nbsp;s2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;s1&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;s2;<br />
</span></div>
&nbsp;&nbsp;&nbsp; 在这两个编译器的 /w4 四级警告打开的时候，就冒出以下的警告来：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">warning&nbsp;C4244:&nbsp;&#8220;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&#8221;:&nbsp;从&#8220;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&#8221;转换到&#8220;</span><span style="color: rgb(0, 0, 255);">short</span><span style="color: rgb(0, 0, 0);">&#8221;，可能丢失数据</span></div>
&nbsp;&nbsp;&nbsp; 为了消除这个警，只能将 += 拆成 = 和 +，如 s1 = s1 + s2。<br />
<br />
&nbsp;&nbsp;&nbsp; 终于，这个问题在VC2008消失了。<br />
<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/978144.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42941/" target="_blank">[新闻]《星际争霸2》一分为三 各种族依次登场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>汉语编程++</title><link>http://www.cnblogs.com/ly4cn/archive/2007/10/17/928102.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 17 Oct 2007 12:20:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/10/17/928102.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/928102.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/10/17/928102.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/928102.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/928102.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 没想到汉语编程又有人开始网上对骂了。一方指另一方骗人，一方吹自已伟大。<br />
&nbsp;&nbsp;&nbsp; 今天群里头有人又把它翻出来了，刚好无聊，也就发明了一个汉语编程语言，集成到visual studio 2005的IDE中，名字就叫汉语编程++，欢迎同样无聊的朋友试用。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">常用头文件</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
<br />
<br />
整数&nbsp;主函数(整数&nbsp;参数数量,&nbsp;字符指针&nbsp;参数 是数组)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;整数&nbsp;变量1&nbsp;赋值为&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果(变量1&nbsp;大于&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打印(</span><span style="color: #000000;">"</span><span style="color: #000000;">可以中文编程\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;系统命令(</span><span style="color: #000000;">"</span><span style="color: #000000;">Pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;返回&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}<br />
<br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; 运行结果就是：&#8220;可以中文编程&#8221;<br />
&nbsp;&nbsp;&nbsp; 语法呢，就是C++一样的，那个&#8220;常用头文件&#8221;的内容如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;整数&nbsp;int</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;如果&nbsp;if</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;大于&nbsp;&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;打印&nbsp;printf</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;系统命令&nbsp;system</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;赋值为&nbsp;=</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;主函数&nbsp;_tmain</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;字符指针&nbsp;_TCHAR*</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;是数组&nbsp;[]</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;返回</span><span style="color: #000000;"><br />
<br />
#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tchar.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 唯一美中不足的是，#include暂时无法汉化。于是劝群里的人用这个写写情书，结果，没人响应...<br />
&nbsp;<span style="color: red;">&nbsp;&nbsp; 不过，#include 可以在项目属性中去掉它（C++高级选项：强制包含），或是指定编译命令参数 /FI "常用头文件" ，这样就可以去掉上面的&#8220;#include "常用头文件"&#8221;了。&nbsp;&nbsp;  </span><br />
-----<br />
以上程序在VC++2005上编译并运行通过。<br />
<br />
附群朋友的程序：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">高興不&lt;&gt;&nbsp; 19:54:59<br />
还真有这么玩的啊 <br />
沐枫(Liny)()&nbsp; 19:55:02<br />
各位朋友，咱们提供一个头文件，于是全中国人都可以用vc++2005来进行中文编程了。<br />
风在奔跑()&nbsp; 19:55:05<br />
我从来没这么玩过. <br />
沐枫(Liny)()&nbsp; 19:55:19<br />
玩玩吧，挺好玩的。<br />
风在奔跑()&nbsp; 19:55:28<br />
干脆把所有函数用中文define成一个中文编程库. <br />
沐枫(Liny)()&nbsp; 19:55:30<br />
不就是一堆#defing<br />
</span><span style="color: #000000;">沐枫(Liny)()&nbsp; 20:13:43<br />
用这个写情书吧各位。<br />
西瓜()&nbsp; 20:13:57<br />
女朋友不懂程序怎么办 <br />
ＴＬＡＨ()&nbsp; 20:13:58<br />
这样的情书...球球不会喜欢的 <br />
高興不&lt;&gt;&nbsp; 20:14:04<br />
。。。情书里就一个弹出的对话框"欲知详情，请看代码" <br />
西瓜()&nbsp; 20:14:17<br />
球球又没出现 </span><br />
<span style="color: #000000;">ＴＬＡＨ()&nbsp;&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">19</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;趁还&nbsp;while</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;那个啥&nbsp;int</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;总的来说&nbsp;main</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;买&nbsp;cin</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;卖&nbsp;cout</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;进&nbsp;&gt;&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;出&nbsp;&lt;&lt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;拜拜了&nbsp;return</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;去掉&nbsp;-=</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;等于&nbsp;=</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;屁&nbsp;100e4</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;我说&nbsp;(</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;是吧&nbsp;)</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;啊&nbsp;a</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;那么就&nbsp;{</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;得了&nbsp;}</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;呀&nbsp;;</span><span style="color: #000000;"><br />
#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br />
<br />
那个啥&nbsp;总的来说&nbsp;我说&nbsp;那个啥&nbsp;啊&nbsp;是吧<br />
那么就&nbsp;那个啥&nbsp;有钱&nbsp;等于&nbsp;屁&nbsp;呀<br />
趁还&nbsp;我说&nbsp;有钱&nbsp;是吧&nbsp;&nbsp;&nbsp;&nbsp;那么就<br />
那个啥&nbsp;多少&nbsp;呀&nbsp;买&nbsp;进&nbsp;多少&nbsp;呀&nbsp;卖&nbsp;出&nbsp;多少&nbsp;呀&nbsp;有钱&nbsp;去掉&nbsp;多少&nbsp;呀<br />
卖&nbsp;出&nbsp;多少&nbsp;呀&nbsp;得了<br />
拜拜了&nbsp;啊&nbsp;呀&nbsp;得了&nbsp;<br />
<br />
高興不</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">19</span><span style="color: #000000;">:</span><span style="color: #000000;">30</span><span style="color: #000000;"><br />
最有语义的中文编程诞生了&nbsp;<br />
<br />
</span><span style="color: #000000;"><br />
</span></div>
<img src ="http://www.cnblogs.com/ly4cn/aggbug/928102.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42940/" target="_blank">[新闻]IBM花300万美元打造互联网三维虚拟紫禁城</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>关于Array.IndexOf</title><link>http://www.cnblogs.com/ly4cn/archive/2007/10/16/926322.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Tue, 16 Oct 2007 08:22:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/10/16/926322.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/926322.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/10/16/926322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/926322.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/926322.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 今天出了一个小问题，倒是令我有些惊讶。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Array.IndexOf(data,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; 结果，n为-1。<br />
&nbsp;&nbsp;&nbsp; 而如果改为：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Array.IndexOf(data,&nbsp;(</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">)</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; 就能输出正确的结果: n=3<br />
&nbsp;&nbsp;&nbsp; 看来，IndexOf对于类型也要求正确匹配。<br />
<br />
-----------<br />
&nbsp;&nbsp;&nbsp; 以上是在VC#2005中测试的。<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/926322.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42938/" target="_blank">[新闻]11个处于悬崖边缘的 Web 公司</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>从赋值到初始化 </title><link>http://www.cnblogs.com/ly4cn/archive/2007/09/27/908297.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Thu, 27 Sep 2007 09:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/09/27/908297.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/908297.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/09/27/908297.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/908297.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/908297.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;C语言确实很优雅，整个语言的设计简洁一致。而在C++中，有一个让人诟病的问题就是变量初始化的不一致性。<br />
&nbsp;&nbsp;&nbsp;C语言中的初始化，都是用花括号进行，简单美观：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">};<br />
</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Point&nbsp;point&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">};<br />
</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Point&nbsp;arrPoint[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<br />
{<br />
&nbsp;&nbsp;{</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">},<br />
&nbsp;&nbsp;{</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">},<br />
&nbsp;&nbsp;{</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">}<br />
};</span></div>
<br />
&nbsp;&nbsp;&nbsp;C++自然也兼容了C语言的初始化机制。然而，C++的Class乃至STL都不支持。它们要用不同的方式来初始化，
甚至根本不能够直接初始化， 只能使用运行时的赋值。<br />
&nbsp;&nbsp;&nbsp;比如Class：
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Param<br />
{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Age;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Value;<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Level;<br />
};<br />
<br />
Param&nbsp;param&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">};&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;ERROR</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">Param&nbsp;param&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">};&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ERROR</span></div>
&nbsp;&nbsp;&nbsp;无法初始化。而如果不初始化的话，所有的成员而处于无政府状态，这显然很不让人放心。于是，C++提供了专门用于Class的初始化方式－－构造函数：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Param<br />
{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;Param(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y)<br />
&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;x_(x),&nbsp;y_(y)<br />
&nbsp;&nbsp;{}<br />
&nbsp;&nbsp;Param()<br />
&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;x_(</span><span style="color: #000000;">0</span><span style="color: #000000;">),&nbsp;y_(</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;{}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x_,&nbsp;y_;<br />
};<br />
<br />
Param&nbsp;param(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">或</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">Param&nbsp;param;</span></div>
&nbsp;&nbsp;&nbsp;有了构造函数，可以在构造函数的初始化列表中对成员进行初始化。可是很明显，这里头还是有一个陷阱，默认构造初始化和非默认构造初始化的调用方式是不一致的。默认构造函数不能用括号来调用，否则编译器将会发疯：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">Param&nbsp;param();</span></div>
&nbsp;&nbsp;&nbsp;它会把上面的语句看成是函数声明，而后面调用的时候就会出错，而错误信息可能会让你抓狂一下。但是这样也就算了，偏偏
new 可以接受有括号和没括号两种写法：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000;">Param</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Param;<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Param</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p2&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Param();</span></div>
&nbsp;&nbsp;&nbsp;再来说说初始化列表。初始化列表，事实上，也只能支持简单的标量类型，诸如int,bool,指针之类的；复杂点的，如数组、结构，不好意思，不支持－－只能在构造函数体中进行赋值。还有一个很迷糊初学者的问题是，成员初始化的顺序仅依赖于成员定义的顺序，而不是初始化列表中的顺序。<br />
<br />
&nbsp;&nbsp;&nbsp;再比如STL容器，这下好象更惨，连构造函数都帮不上忙了，除了初始化一个空的容器，或是复制一下别的容器，我们只能做用默认构造函数进行初始化。我们拿数组和vecotr做个比较：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;数组</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;arr[]</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">};<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;vector</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;iarr;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;必须在某个函数中赋初值</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init()<br />
{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span>&nbsp;<span style="color: #000000;">4</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;iarr.push_back(i);<br />
}</span></div>
<br />
&nbsp;&nbsp;&nbsp;再复杂一点的数据结构，那单单赋值程序就要写上老长，而且还不好看。还要记得调用。这对于仅仅是简单的设置一些初值的用途来说，太过于烦琐。<br />
<br />
&nbsp;&nbsp;&nbsp;横向比较，这次好象C++还不会太落伍，只有C和动态语言提供了初始化特性，其它支持OO高级语言好象都是学C++的。如Java,
C#(注C#3.0开始提供初始化功能)...<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;C++能不能做到简洁一致的实始化呢？<br />
&nbsp;&nbsp;&nbsp;Boost的assign库做了许多有益的工作。使用assign库，至少现在可以初始化了：
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000;">vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;arr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;list_of(</span><span style="color: #000000;">1</span><span style="color: #000000;">)(</span><span style="color: #000000;">2</span><span style="color: #000000;">)(</span><span style="color: #000000;">3</span><span style="color: #000000;">)(</span><span style="color: #000000;">4</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />typedef&nbsp;boost::tuple</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tuple;<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tuple</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tuple_list_of(&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">foo</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;)(&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">bar</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;);<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;map_list_of(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">)(</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">)(</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">)(</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">)(</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">);<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />stack</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;names&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;list_of(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Mr.&nbsp;Foo</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Mr.&nbsp;Bar</span><span style="color: #000000;">"</span><span style="color: #000000;">)(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Mrs.&nbsp;FooBar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;).to_adapter();</span></div>
&nbsp;&nbsp;&nbsp;如果是赋值，也可以简略很多：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000;">vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v;<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />v&nbsp;</span><span style="color: #000000;">+=</span>&nbsp;<span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,repeat(</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">),</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">,</span><span style="color: #000000;">9</span><span style="color: #000000;">;<br />
<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;v&nbsp;=&nbsp;[1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]</span></div>
&nbsp;
不过，也仅能如此了。assign经过许多努力，也仅能支持容器的初始化，而且还不够漂亮。<br />
<br />
&nbsp;&nbsp;&nbsp;C++0x已确定提供与C一致的初始化功能。 <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2215.pdf"><u><font color="#0000ff">Initialer lists</font></u></a>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2220.pdf"><u><font color="#0000ff">Initializer Lists for Standard Containers</font></u></a>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2385.pdf"><u><font color="#0000ff">Initializer lists WP
wording</font></u></a>&nbsp;等草案就是为了这个目的服务的。<br />
&nbsp;&nbsp;&nbsp;如果使用C++0x，那么程序的初始化将变得清晰和一致：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">complex</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;z&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">};&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">或</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">complex</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;z&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">};&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始化中，有等号和无等号都是允许的，下同。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">z&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">};<br />
<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">};&nbsp;<br />
<br />
</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">{</span><span style="color: #000000;">"</span><span style="color: #000000;">once</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">upon</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">a</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">time</span><span style="color: #000000;">"</span><span style="color: #000000;">};&nbsp;<br />
<br />
f(&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">Nicholas</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Annemarie</span><span style="color: #000000;">"</span><span style="color: #000000;">}&nbsp;);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;参数是两个元素的列表</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Norah</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;返回只有一个元素的列表</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;e&nbsp;{};&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始化为0或NULL指针</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;anim&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<br />
{&nbsp;<br />
&nbsp;&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">bear</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">},&nbsp;<br />
&nbsp;&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">cassovary</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">},&nbsp;<br />
&nbsp;&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">tiger</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">}&nbsp;<br />
};&nbsp;</span></div>
<br />
&nbsp;&nbsp;&nbsp;这好象是C++欠了十多年的债吧。
<img src ="http://www.cnblogs.com/ly4cn/aggbug/908297.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42937/" target="_blank">[新闻]扎克博格：Facebook要先赚吆喝后赚钱</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>从for到foreach</title><link>http://www.cnblogs.com/ly4cn/archive/2007/09/26/907088.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 26 Sep 2007 11:48:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/09/26/907088.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/907088.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/09/26/907088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/907088.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/907088.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 一直在使用C/C++，对于循环语句while、do while、for，对于for情有独钟，因为其简洁、清晰、灵活。访问数组类型的变量，只有for写出来的语句是最易于阅读的，如：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;arr[N]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #008000;">/*</span><span style="color: #008000;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000;">*/</span><span style="color: #000000;">};<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br />
&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">arr[%d]&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;i,&nbsp;arr[i]);</span></div>
<br />
&nbsp;&nbsp;&nbsp; 然而，这种情况，到了STL时，就有些变味了：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyClass</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::const_iterator&nbsp;iter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_vecData.begin();&nbsp;iter&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;m_vecData.end();&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">iter)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">iter</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DoSomeThing(param);<br />
}<br />
</span></div>
&nbsp;&nbsp;&nbsp; 这么长的一个for，不再给人一种清晰的感觉了。或许因为这个程序比较短，还没有太大的感觉，当回头去看自已的程序中，有不少这样的写法时，我就觉得一阵心烦。改改？<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(size_t&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;m_vecData.size();&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">m_vecData[i].IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_vecData[i].DoSomeThing(param);<br />
}</span></div>
&nbsp;&nbsp;&nbsp; 不错，还是简单点好啊。但是因为这里举的是vector的例子。如果是list或是别的什么容器，就行不通了。<br />
&nbsp;&nbsp;&nbsp; 其它的高级语言，都提供了foreach或是for in语句，写出来就很清晰：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">foreach</span><span style="color: #000000;">(item&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;m_vecData)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param);<br />
}</span></div>
&nbsp;&nbsp;&nbsp; C++是不是也可以这么简单？好象STL中也有一个for_each，试着改写一下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">struct</span><span style="color: #000000;"> IfNotBusyThenDoSomeThing<br />
{<br />
&nbsp;&nbsp;&nbsp; IfNotBusyThenDoSomeThing(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Param</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;param)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;param_(param)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()&nbsp;(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;MyClass</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;item)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param_);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Param</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;param_;<br />
};<br />
<br />
for_each(m_vecData.begin(),&nbsp;m_vecData.end(), </span><span style="color: #000000;">IfNotBusyThenDoSomeThing</span><span style="color: #000000;">(param));</span></div>
&nbsp;&nbsp;&nbsp; 不错，for语句简单了，但是却多了<span style="color: #000000;">IfNotBusyThenDoSomeThing的定义，这代码可是多了好几倍。要是每个循环都要来这么一下，我还不如直接写for，要来得爽快一些。或许还有别的办法：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyClass</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;notBusyClass;<br />
remove_copy_if(m_vecData.begin(),&nbsp;m_vecData.end(),&nbsp;inserter(notBusyClass,&nbsp;notBusyClass.begin()), mem_fun_ref(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::IsBusy));<br />
for_each(notBusyClass.begin(),&nbsp;notBusyClass.end(),&nbsp;bind2nd(mem_fun_ref(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::DoSomeThing),&nbsp;param));</span></div>
&nbsp;&nbsp;&nbsp; 天哪，这种写法好象更恐怖。而且，还不是每种情况都能用的：<br />
&nbsp;&nbsp;&nbsp; 1. notBusyClass不能是vector&lt;const MyClass&amp;&gt;，因为不能建立指向引用的指针。这就要求MyClass是可拷贝的。但就算是可拷贝的，有时候拷贝成本也是很高的。<br />
&nbsp;&nbsp;&nbsp; 2. MyClass::DoSomeThing的参数不能是引用（我们常定义参数为：const Param&amp;），因为不能定义引用的引用这种类型。<br />
&nbsp;&nbsp;&nbsp; 3. 一旦出现错误，这错误信息会让人极其昏倒。<br />
<br />
&nbsp;&nbsp;&nbsp; 看来单靠标准C++是不成的。Boost的lambda的库似乎很不错，用用：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;for_each(m_vecData.begin(),&nbsp;m_vecData.end(), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if_then( !bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::IsBusy,&nbsp;_1), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::DoSomeThing,&nbsp;_1,&nbsp;param)));<br />
</span></div>
&nbsp;&nbsp;&nbsp; 不错，好了一些，但是还是很不好看。有没有更好的？有，boost1.34新加入的BOOST_FOREACH：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">BOOST_FOREACH(cosnt&nbsp;MyClass</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;item,&nbsp;m_vecData)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param);<br />
}</span></div>
&nbsp;&nbsp;&nbsp; Oh Yeah!<br />
<br />
&nbsp;&nbsp;&nbsp; 好了，问题来了，为什么C++不直接在语言中提供foreach这个功能呢？<br />
&nbsp;&nbsp;&nbsp; 个人认为，原因有几点：<br />
&nbsp;&nbsp;&nbsp; 1. C/C++除了数组外，没有内置的容器，因此for语句足矣。<br />
&nbsp;&nbsp;&nbsp; 2. 当C++进化到STL的时候，C++标准委员会根本没空去考虑其它的。<br />
&nbsp;&nbsp;&nbsp; 而其它高级语言之所以内置了foreach，就是因为它们一开始就提供了标准的容器库和迭代/枚举接口，因此提供foreach就顺理成章了。<br />
<br />
&nbsp;&nbsp;&nbsp; 现在，总算C++开始考虑，由模板引入而造成的代码复杂性的问题，这的确是Cpper的福音。因此，一系列相关的提案被提交。牵涉到上面代码中的提案就有： <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf">Decltype</a>， <a href="http://www.research.att.com/%7Ebs/N1968-lambda-expressions.pdf">Lambda expressions and closures for C++</a>，<a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1796.html">proposal for new for-loop</a>。　　<br />
&nbsp;&nbsp;&nbsp; 其中，最符合foreach要求的就是新的for循环。采用这个语句，上面的程序就可以这么写：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;MyClass</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;item&nbsp;:&nbsp;m_vecData)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param);<br />
}</span></div>
<br />
&nbsp;&nbsp;&nbsp; 不过，考虑到Decltype&amp;auto提案已经被采纳，新的for-loop就不知道能不能再被采纳。因为使用Decltype&amp;auto后，程序可以这么写：<br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">for</span><span style="color: #000000;">(auto&nbsp;iter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_vecData.begin(),&nbsp;end&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_vecData.end();&nbsp;iter&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;end;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">iter)<br />
{<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">iter-&gt;IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter-&gt;DoSomeThing(param);<br />
</span><span style="color: #000000;">}</span></div>
&nbsp;&nbsp;&nbsp; 似乎还是复杂点是吧？但是有了decltype&amp;auto后，foreach功能可以用程序库或宏的形式被模拟，BOOST_FOREACH就是这么做的。具体模拟的方式&lt;&lt;proposal for new for-loop&gt;&gt;提案写的很清楚了。<br />
&nbsp;&nbsp;&nbsp; 同时，假如lambda提案要是能再被通过的话，那就真的要开心了：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">for_each(<br />
&nbsp;&nbsp;m_vecData,&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">(item)</span><span style="color: #0000ff;"> extern</span><span style="color: #000000;">(param)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(!item.IsBusy())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item.DoSomeThing(param);<br />
&nbsp;&nbsp;}<br />
);</span></div>
&nbsp;&nbsp;&nbsp; Cool!<br />
&nbsp;&nbsp;&nbsp; <span style="color: green;"><strong> <a href="">沐枫小筑</a></strong></span><br />
&nbsp;&nbsp;&nbsp; 不过，VC++2008倒是增加了foreach功能，不过关键字不是foreach，而是for each，这个让人有点郁闷．要用的时候最好用宏定义替换一下，免得可移植性上出现问题．<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/907088.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42936/" target="_blank">[新闻]金融风暴改写富豪榜排名　巴菲特资产超盖茨</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>关注C++0x: Concept</title><link>http://www.cnblogs.com/ly4cn/archive/2007/09/09/887809.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sun, 09 Sep 2007 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/09/09/887809.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/887809.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/09/09/887809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/887809.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/887809.html</trackback:ping><description><![CDATA[　　要说C++0x中对泛型编辑最大的改变，当属Concept了。<br />
Concept这个东西，其实并不是刚刚提出来的。可以说，Concept是STL的基础。<br />
<br />
STL之于C++的地位不言而寓，而其中最重要的，当属迭代器(Iterator)的概念(Concept)了。这是接触STL后得到的最明显的Concept。有了迭代器，就可以将算法与容易分离开来，这样就奠定了STL的基础。于是一个又一个服务于STL的概念(Concept)就诞生了。<br />
不过相信大多数人只是直接使用STL，因此对于Concept没有什么印象。一旦涉及到自行创建程序库，特别是创建相容于STL规范的容器或算法的时候，就肯定要接触到STL中的一堆Concept了。<br />
举个简单的例子，如何实现一个Iterator？STL中的Iterator有几个类别：ForwardIterator、BidirectionalIterator、RandomAccessIterator等5类。现在需要实现一个用于vector容器的Iterator，显然是要符合上述三种类型。但是要从STL找到象ForwardIterator的通用类，肯定是找不到。最多只能找到一个Iterator的通用定义：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Category,&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Type,&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Distance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ptrdiff_t<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Pointer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Type</span><span style="color: #000000;">*</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Reference&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Type</span><span style="color: #000000;">&amp;&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;iterator&nbsp;{<br />
&nbsp;&nbsp;&nbsp;typedef&nbsp;Category&nbsp;iterator_category;<br />
&nbsp;&nbsp;&nbsp;typedef&nbsp;Type&nbsp;value_type;<br />
&nbsp;&nbsp;&nbsp;typedef&nbsp;Distance&nbsp;difference_type;<br />
&nbsp;&nbsp;&nbsp;typedef&nbsp;Pointer&nbsp;pointer;<br />
&nbsp;&nbsp;&nbsp;typedef&nbsp;Reference&nbsp;reference;<br />
&nbsp;&nbsp;&nbsp;};<br />
</span></div>
很昏倒吧，全是typedef。至于更具体的Concept，只好打开C++的标准文档了，想要满足ForwardIterator要哪些需求，满足RandomAccessIterator要哪些需求，然后对照着去实现。<br />
至于实现后的Iterator是否真的符合这些Concept，就只好摸摸自已的良心，问问是否完全测试过了。<br />
为什么会这样呢？因为这些Concept目前只停留在文档中。C++编译器对Concep完全没有概念。更过份的是，C++编译器甚至完全看不到或只看到一部份刚才定义的Iterator－－因为大多数编译器仅对确实需要具现化的类或成员才进行编译。<br />
<br />
比如：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;test<br />
{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;kill_cpp(T&nbsp;t)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不要调用我啊！<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
};<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;test</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">t.kill_cpp(0);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}<br />
</span></div>
编译就完全通过，C++编译器对&#8220;<span style="color: #000000;">不要调用我啊！</span>&#8221;这几个字视而不见。我有时候就利用这个特点，以保证某些函数确实不应该被调用，而一旦被误调用了，还可以有一个能看得明白的错误信息：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">error&nbsp;C2065:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">不要调用我啊！</span><span style="color: #000000;">':&nbsp;undeclared&nbsp;identifier&nbsp; (VC2008 Beta2)</span><span style="color: #000000;"><br />
</span></div>
<br />
也许STL的Concept还比较少接触。那么在写泛型程序时，也总会遇到一些类似的情形。比如下面的代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Show(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;t)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;t.Message()&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br />
}<br />
</span></div>
这个函数用于显示某个类的信息。显然，它要求该类型必须拥有 Message 成员函数。但这个函数的用户知道吗？也许知道，因为你文档写的很详细。可是一旦用户忘记或者误用了，那麻烦就出来了，肯定是一堆错误信息。这个例子还比较简单，也就多几个错误信息，稍微仔细查看，还是能够解决问题。那么下面的例子：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br />
<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;list</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;lst;<br />
&nbsp;&nbsp;&nbsp;&nbsp;sort(lst.begin(),&nbsp;lst.end());<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}</span></div>
这个例子将会产生一大堆的错误信息，足以让刚接触到的人如坠云雾。而实际原因只不过是list的iteraotr不是RandomAccessIterator(也就是说list不能象数组一样随机访问，所以不能使用sort函数)。<br />
<br />
Java和.NET等新加入泛型编程特性的语言，对此自然深有体会，不约而同都加入了模板约束的机制。假如让.NET来实现这个sort的话，它可能会这么写：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;sort</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(T&nbsp;container)&nbsp;where&nbsp;T&nbsp;:&nbsp;IEnumerable<br />
{<br />
</span><span style="color: #008000;">&nbsp; </span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}<br />
</span></div>
这样，当container被代入共它类型，如int时，编译时将会给出明确的错误：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">The&nbsp;type&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">int</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;cannot&nbsp;be&nbsp;used&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;type&nbsp;parameter&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">T</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;the&nbsp;generic&nbsp;type&nbsp;or&nbsp;method </span><span style="color: #000000;">sort&lt;T&gt;(T)</span><span style="color: #000000;">'</span><span style="color: #000000;">. <br />
There&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;no&nbsp;boxing&nbsp;conversion&nbsp;from&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">int</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;to&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">System.Collections.IEnumerable</span><span style="color: #000000;">'</span><span style="color: #000000;">.</span><span style="color: #000000;">　（VC# 2008 Beta2)<br />
</span></div>
<br />
是啊，模板约束很有用，至少可以让我们放心，编译器会帮我们检查那个T要满足什么条件。于是开始羡慕起Java和C#了：毕竟是后来者，把C++的优点采用了，缺点补上了...<br />
为了让C++也能拥有这个特性，C++的模板库编写者真的是费尽心思。类似模板元编程等技术横空出世。boost有相当部份的程序类在为此努力。但是所有的努力，都仅仅只能让程序库的易用性有一些改善，却大大增加了程序库的编写复杂度和可维护性。势必在C++语言中内置相关的特性，才是最终的解决方案。<br />
<br />
盼啊盼啊，终于盼来了C++0x，而且令人惊喜的是，C++并没有采用Java和C#那一套模板约束的方式，而是将STL的Concept从文档化变成语言特性了。这个变化我认为是革命性的，而且还带来了前所未有的新的编程方式，将创建继模板以来的新的流行－－可以预见，C#和Java最终也将会采用这个特性。<br />
Concept的应用包含了C#和Java中的模板约束，但不止于此。模板约束仅仅是基本。<br />
<br />
对于上面sort的例子，在C++0x中将会出现比较简洁的错误信息：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">sort.cpp:&nbsp;In&nbsp;function&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">void&nbsp;f()</span><span style="color: #000000;">'</span><span style="color: #000000;">:<br />
sort.cpp:</span><span style="color: #000000;">7</span><span style="color: #000000;">:&nbsp;error:&nbsp;no&nbsp;matching&nbsp;function&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;call&nbsp;to&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">sort(std::_List_iterator&lt;int&gt;,&nbsp;std::_List_iterator&lt;int&gt;)</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">path</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">:&nbsp;note:&nbsp;candidates&nbsp;are:&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;std::sort(_Iter,&nbsp;_Iter)&nbsp;[with&nbsp;_Iter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;std::_List_iterator</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">where&nbsp;clause</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
sort.cpp:</span><span style="color: #000000;">7</span><span style="color: #000000;">:&nbsp;note:&nbsp;&nbsp;&nbsp;no&nbsp;concept&nbsp;map&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;requirement&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">std::MutableRandomAccessIterator&lt;std::_List_iterator&lt;int&gt;&nbsp;&gt;</span><span style="color: #000000;">'</span></div>
错误信息一条：找不到可用的sort函数。<br />
提示信息一条：List的Iterator没有到MutableRandomAccessIterator的映射。<br />
稍微动一下脑，也就明白sort是需要随机访问的Iterator，而List既没有该类别的Iterator，也没有可以到该类别的Iterator的映射。<br />
解决方法有两个：一是换用有随机访问的Iterator的容器，如vector；一是实现一个到MutableRandomAccessIterator的映射。<br />
<br />
Concept目前在C++0x的提案已经确认肯定会被通过了。Concept引入C++，目的是要让模板库得容易使用，和容易编写。<br />
<br />
对Concept有兴趣的朋友可以查看相关的文档。也许因为C++0x众多令人激动的特性，我会用我的方式进行一一表达。<br />
<br />
相关链接：<br />
http://del.icio.us/pongbablog/cplusplus<br />
<a href="http://blog.csdn.net/pongba/archive/2007/08/04/1726031.aspx" style="font-size: 12pt;">　　《C++0x漫谈》系列之：Concept, Concept!</a><br />
<a href="http://blog.csdn.net/pongba/archive/2006/02/15/599842.aspx">　　C++0x展望[语言核心进化]</a><br />
呵呵，偷一下懒，刘未鹏的文章推荐对C++0x感兴趣的朋友观看，文后所附的资料及相关的标准提案相当详细。这里就不照抄了。<br />
<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/887809.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42935/" target="_blank">[新闻]红杉资本发出严重警告：黄金时代已成历史</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Ultimate Toolbox 开源了</title><link>http://www.cnblogs.com/ly4cn/archive/2007/09/07/886224.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Fri, 07 Sep 2007 12:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/09/07/886224.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/886224.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/09/07/886224.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/886224.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/886224.html</trackback:ping><description><![CDATA[又是后知后觉，今天猪猪给我一个地址，让我看看怎么回事，结果我一看，是codeproject的MFC专栏。乍一看，真的晕了，所有的项目都是Ultimate Toolbox的。再一看，哇，Ultimate Toolbox从2007年8月起开源了，免费了。其最后几个产品是5月份发布的。<br />
<br />
就象被个馅饼砸中了一样，有点晕。想当年，MFC下面最知名的界面库Ultimate ToolBox是个非常让人留口水的。没想到现在居然开源了，而且免费了。开发小组还花了许多精力，写了无数个控件介绍和下载贴在codeproject中。<br />
<br />
再到主页http://www.theultimatetoolbox.com/中一看，原来是要停止这个项目了。那么，对于原有客户来说，开源免费确实是唯一的选择了。而Ultimate发生了什么，主页上没有说。或许是转型了。<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/886224.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42934/" target="_blank">[新闻]2008年10月11日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>关于C#2.0编译器的一个瘕疵</title><link>http://www.cnblogs.com/ly4cn/archive/2007/08/29/874911.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 29 Aug 2007 09:38:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/08/29/874911.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/874911.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/08/29/874911.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/874911.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/874911.html</trackback:ping><description><![CDATA[C#2.0编译器有个瘕疵，在开发过程中常常让人哭笑不得。被郁闷了。<br />
主要发生在码代码时，将关键字打错的情况。<br />
<br />
我就举两个例子。<br />
例１：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PacketId<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;<span style="color: red;">cosnt</span> </span><span style="color: #0000ff;">byte</span><span style="color: #000000;">&nbsp;LOGIN&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
上面红色的cosnt其实是笔误，应该是const，编译后当然会出错。但是错误提示居然让人不知所措：<br />
<span style="color: red;">错误 CS1519: 类、结构或接口成员声明中的标记&#8220;byte&#8221;无效</span><br />
于是我找啊找啊，byte没有问题啊，真是头大。最后，多看了好多眼，才发现是const打错了。该死的，cosnt错了居然颜色和关键字一样(是不是我用了Assist造成的颜色不对呢？)。<br />
<br />
例２：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PacketId<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;"><span style="color: red;"><span style="color: #000000;"><span style="color: #ff0000;">pubilc</span></span></span></span><span style="color: red;"><span style="color: #000000;">&nbsp;</span></span></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">&nbsp;LOGIN&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
上面的pubilc也是笔误，应该是public，错误信息为：<br />
<span style="color: #ff0000;">错误 CS1519: 类、结构或接口成员声明中的标记&#8220;const&#8221;无效<br />
</span>　　痛苦啊，怎么常量也不能定义了？？这回有经验了，果然，是public打错了。<br />
<br />
－－－－<br />
呵呵，不要笑我。<br />
<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/874911.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42933/" target="_blank">[新闻]搞死开心网还是搞活他？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>VC2008 beta2 的几个新东西</title><link>http://www.cnblogs.com/ly4cn/archive/2007/08/14/854559.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Mon, 13 Aug 2007 16:34:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/08/14/854559.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/854559.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/08/14/854559.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/854559.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/854559.html</trackback:ping><description><![CDATA[关于.net方面，已经有许多人在关注了，我就关注一下，VC2008方面的新东西吧。<br>1. 晕倒，实证后，没有增加tr1库（仅增加了tr1::hexfloat).<br>2. 对于模板的&gt;&gt;符号，中间不再需要空格了。<br>3. 增加了for each(T&amp; in A){}语法－－这个不算是改进吧，估计是为了与.NET一起工作的产物。<br><br>这是今天下午初步扫一眼VC2008中Native C++后的感觉。<br>同时，标准库已不再支持Win95/98/me和NT4了。<br><br>至于C++/CLR，一个重要的部份就是STL/CLR。<br><br>  <img src ="http://www.cnblogs.com/ly4cn/aggbug/854559.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42932/" target="_blank">[新闻]网络书店“新”军</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>C++指针探讨 (四) 函数对象</title><link>http://www.cnblogs.com/ly4cn/archive/2007/07/21/826885.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sat, 21 Jul 2007 13:30:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/07/21/826885.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/826885.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/07/21/826885.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/826885.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/826885.html</trackback:ping><description><![CDATA[函数对象不是函数指针。但是，在程序代码中，它的调用方式与函数指针一样，后面加个括号就可以了。<br />
<span style="color: #ffffff;">　　这是入门级的随笔，说的是函数对象的定义，使用，以及与函数指针，成员函数指针的关系。&nbsp; <br />
</span><a style="color: #ffffff;" href="http://www.cnblogs.com/ly4cn/archive/2007/07/21/826885.html">沐枫小筑</a><br />
函数对象实质上是一个实现了operator()--括号操作符--的类。<br />
例如：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">class</span><span style="color: #000000;"> Add<br />
{<br />
</span><span style="color: #0000ff;">public:<br />
</span><span style="color: #000000;">&nbsp; </span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;b;<br />
&nbsp;&nbsp;}<br />
};</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Add&nbsp;add;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;定义函数对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;add(</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 5</span></div>
<br />
函数指针版本就是：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;AddFunc(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b)<br />
{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;b;<br />
}<br />
typedef&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">Add)&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b);</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Add&nbsp;add&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">AddFunc;<br />
cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;add(</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 5</span></div>
<br />
呵呵，除了定义方式不一样，使用方式可是一样的。都是：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;add(</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">);</span></div>
<br />
既然函数对象与函数指针在使用方式上没什么区别，那为什么要用函数对象呢？很简单，函数对象可以携带附加数据，而指针就不行了。<br />
下面就举个使用附加数据的例子：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;less<br />
{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;less(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;num):n(num){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n;<br />
};<br />
</span></div>
<br />
<br />
使用的时候：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;less&nbsp;isLess(</span><span style="color: #000000;">10</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;isLess(</span><span style="color: #000000;">9</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;isLess(</span><span style="color: #000000;">12</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出&nbsp;1&nbsp;0<br />
</span></div>
<br />
这个例子好象太儿戏了，换一个：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;SIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[SIZE]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">50</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">};<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;找到小于数组array中小于10的第一个数的位置</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pa&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> std::find_if(array,&nbsp;array&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;SIZE,&nbsp;less(</span><span style="color: #000000;">10</span><span style="color: #000000;">)); </span><span style="color: #008000;">//</span><span style="color: #008000;"> pa 指向 9 的位置</span><br />
<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;找到小于数组array中小于40的第一个数的位置</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> std::find_if(array,&nbsp;array&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;SIZE,&nbsp;less(</span><span style="color: #000000;">40</span><span style="color: #000000;">));</span><span style="color: #008000;">　//</span><span style="color: #008000;"> pb 指向 30 的位置<br />
</span></div>
<br />
这里可以看出函数对象的方便了吧？可以把附加数据保存在函数对象中，是函数对象的优势所在。<br />
它的弱势也很明显，它虽然用起来象函数指针，但毕竟不是真正的函数指针。在使用函数指针的场合中，它就无能为力了。例如，你不能将函数对象传给qsort函数！因为它只接受函数指针。<br />
<br />
要想让一个函数既能接受函数指针，也能接受函数对象，最方便的方法就是用模板。如：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;"><span style="color: #0000ff;">typename</span> FUNC</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count_n(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;array,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size, FUNC func)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(func(array[i]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count;<br />
}</span></div>
<br />
这个函数可以统计数组中符合条件的数据个数，如：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;SIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[SIZE]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">50</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">};<br />
cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;count_n(array,&nbsp;SIZE,&nbsp;less(</span><span style="color: #000000;">10</span><span style="color: #000000;">));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;2</span></div>
<br />
用函数指针也没有问题：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;less10(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br />
}<br />
cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;count_n(array,&nbsp;SIZE,&nbsp;less10);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;2</span></div>
<br />
另外，函数对象还有一个函数指针无法匹敌的用法：可以用来封装类成员函数指针！<br />
因为函数对象可以携带附加数据，而成员函数指针缺少一个类实体(类实例)指针来调用，因此，可以把类实体指针给函数对象保存起来，就可以用于调用对应类实体成员函数了。<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;"><span style="color: #0000ff;">typename</span>&nbsp;O</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;memfun<br />
{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memfun(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">(O::</span><span style="color: #000000;">*</span><span style="color: #000000;">f)(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">),&nbsp;O</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;o):&nbsp;pFunc(f),&nbsp;pObj(o){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pObj</span><span style="color: #000000;">-&gt;*</span><span style="color: #000000;">pFunc)(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">(O::</span><span style="color: #000000;">*</span><span style="color: #000000;">pFunc)(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;O</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pObj;<br />
};<br />
<br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A<br />
{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doIt(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">!</span><span style="color: #000000;">"</span><span style="color: #000000;">;}<br />
};</span></div>
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;memfun</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">A</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;call(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">A::doIt,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;保存&nbsp;a::doIt指针以便调用</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;call(</span><span style="color: #000000;">"</span><span style="color: #000000;">Kitty</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出&nbsp;Hello&nbsp;Kitty!<br />
</span></div>
<br />
大功告成了，终于可以方便保存成员函数指针，以备调用了。<br />
<br />
不过，现实是残酷的。函数对象虽然能够保有存成员函数指针和调用信息，以备象函数指针一样被调用，但是，它的能力有限，一个函数对象定义，最多只能实现一个指定参数数目的成员函数指针。<br />
标准库的mem_fun就是这样的一个函数对象，但是它只能支持0个和1个参数这两种成员函数指针。如 int A::func()或void A::func(int)、int A::func(double)等等，要想再多一个参数如：int A::func(int, double)，不好意思，不支持。想要的话，只有我们自已写了。<br />
而且，就算是我们自已写，能写多少个？5个？10个？还是100个（这也太恐怖了）？<br />
好在boost库提供了boost::function类，它默认支持10个参数，最多能支持50个函数参数(多了，一般来说这够用了。但它的实现就是很恐怖的：用模板部份特化及宏定义，弄了几十个模板参数，偏特化(编译期)了几十个函数对象。<br />
<br />
----<br />
C++0x已经被接受的一个提案，就是可变模板参数列表。用了这个技术，就不需要偏特化无数个函数对象了，只要一个函数对象模板就可以解决问题了。期待吧。<br />
<br />
<img src ="http://www.cnblogs.com/ly4cn/aggbug/826885.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42931/" target="_blank">[新闻]百度C2C电子商务平台“有啊”youa.com上线</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>boost 1.34 终于简化了内嵌python的支持</title><link>http://www.cnblogs.com/ly4cn/archive/2007/05/23/756961.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 23 May 2007 04:55:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/05/23/756961.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/756961.html</wfw:comment><comments>http://www.cnblogs.com/ly4cn/archive/2007/05/23/756961.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ly4cn/comments/commentRss/756961.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ly4cn/services/trackbacks/756961.html</trackback:ping><description><![CDATA[boost 1.34 终于简化了内嵌python的支持。<br>还支持了python2.5。<br>在中文windows下用vc8编译boost的过程中，虽然仍有代码页字符警告，但是可以正常编译成功，不再象1.33.1那样造成正则表达式库不修改源码不能够编译通过的问题了。<br><br>下面的例子是从boost文档中来的：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">python.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #0000ff;">ref</span><span style="color: #000000;">.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;boost::python;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;greet()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;main&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;import(</span><span style="color: #000000;">"</span><span style="color: #000000;">__main__</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;global(main.attr(</span><span style="color: #000000;">"</span><span style="color: #000000;">__dict__</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Define&nbsp;greet&nbsp;function&nbsp;in&nbsp;Python.</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;exec(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">def&nbsp;greet(a):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;return&nbsp;'Hello&nbsp;%s&nbsp;from&nbsp;Python!'&nbsp;%&nbsp;a&nbsp;\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global,&nbsp;global);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;greet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;global[</span><span style="color: #000000;">"</span><span style="color: #000000;">greet</span><span style="color: #000000;">"</span><span style="color: #000000;">];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;lst;<br>&nbsp;&nbsp;&nbsp;&nbsp;lst.append(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;lst.append(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;greet(lst);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;extract</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(r);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;message&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_tmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br>&nbsp;&nbsp;&nbsp;&nbsp;greet();<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">Pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
<br><br><br><img src ="http://www.cnblogs.com/ly4cn/aggbug/756961.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42930/" target="_blank">[新闻]Silverlight 2.0正式版下周发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Boost 1.34.0 终于5.12发布了</title><link>http://www.cnblogs.com/ly4cn/archive/2007/05/13/744988.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sun, 13 May 2007 14:18:00 GMT</pubDate><guid>http://www.cnblogs.com/ly4cn/archive/2007/05/13/744988.html</guid><wfw:comment>http://www.cnblogs.com/ly4cn/comments/744988.html</wfw:comment><comments>http: