﻿<?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>C++博客-zhujian</title><link>http://www.cppblog.com/zhujian/</link><description>揣着梦想骑驴找马但不虐待驴</description><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 14:03:40 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 14:03:40 GMT</pubDate><ttl>60</ttl><item><title>ubuntu 10.04编译安装gcc 4.6.1</title><link>http://www.cppblog.com/zhujian/archive/2011/07/11/gcc-4-6-1.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Mon, 11 Jul 2011 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/07/11/gcc-4-6-1.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/150707.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/07/11/gcc-4-6-1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/150707.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/150707.html</trackback:ping><description><![CDATA[在我的上一篇随笔里的模板代码在vs2010下可以编译通过,在gcc 4.4.3下却报错,后来请教师兄说可能是gcc版本太低,对模板的要求更苛刻,他用的gcc 4.5编译可以通过,所以一时心血来潮编译安装个gcc 最新版,也就是gcc 4.6.1<br /><br />我参照了这篇博客 <a href="http://www.iteye.com/topic/1111655">http://www.iteye.com/topic/1111655</a> ,但是安装过程中遇到了些问题,这里记载下,希望给遇到相同问题的一个参考.<br /><br />在gcc-4.6.1下configure时出来 check CLooG installed....no(差不多是这意思,具体错误信息忘了),我在Synaptic Package Manager里搜索cloog,将libcloog-ppl-dev和libcloog-pll0安装了,configure通过:-)<br /><br />make &amp;&amp; make install 都顺利通过:-)<br /><br />我编译我们的开源项目stupidalgorithm <a href="http://code.google.com/p/stupidalgorithm/">http://code.google.com/p/stupidalgorithm/</a> ,编译通过,但运行不通,提示需要库GLIBCXX_3.4.15,这时将<div>gcc-4.6.1/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.16复制到/usr/lib,然后ln -s libstdc++.so.6 libstdc++.so.6.0.16,然后sudo ldconfig即可:-)<br /><div></div></div><img src ="http://www.cppblog.com/zhujian/aggbug/150707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-07-11 22:06 <a href="http://www.cppblog.com/zhujian/archive/2011/07/11/gcc-4-6-1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux和Windows编译C++模板问题</title><link>http://www.cppblog.com/zhujian/archive/2011/07/09/template.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Sat, 09 Jul 2011 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/07/09/template.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/150555.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/07/09/template.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/150555.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/150555.html</trackback:ping><description><![CDATA[下面是示例代码，在vs2010下编译成功，但在linux下编译报错。<br /><br />基类com_alg代码片段：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;real_para</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;com_alg<br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">{<br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;com_alg(std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;conf_path)<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">virtual ~</span><span style="color: #000000;">com_alg()&nbsp;{&nbsp;}<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">};</span></div><br />子类de_alg代码片段：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">com_alg.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;de_alg<br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;com_alg</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">de_para</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">{<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;de_alg(std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;conf_path):<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red;">com_alg(conf_path)</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">de_alg()&nbsp;{&nbsp;}<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">};</span></div><br />注意de_alg代码第8行红色部分，在vs2010下编译通过，但是在linux(g++ 4.4.3)下编译出错：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">de_alg.h:&nbsp;In&nbsp;constructor&nbsp;&#8216;de_alg::de_alg(std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">)&#8217;:<br />de_alg.h:</span><span style="color: #000000;">30</span><span style="color: #000000;">:&nbsp;error:&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;&#8216;de_alg&#8217;&nbsp;does&nbsp;not&nbsp;have&nbsp;any&nbsp;field&nbsp;named&nbsp;&#8216;com_alg&#8217;<br />de_alg.h:</span><span style="color: #000000;">30</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;&#8216;com_alg</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">de_para</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::com_alg()&#8217;<br />com_alg.h:</span><span style="color: #000000;">29</span><span style="color: #000000;">:&nbsp;note:&nbsp;candidates&nbsp;are:&nbsp;com_alg</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">real_para</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::com_alg(std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">)&nbsp;[with&nbsp;real_para&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;de_para]<br />com_alg.h:</span><span style="color: #000000;">27</span><span style="color: #000000;">:&nbsp;note:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com_alg</span><span style="color: #000000;">&lt;de_para</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::com_alg(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;com_alg</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">de_para</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">)</span></div><br />将代码改为<span style="color: red;">com_alg&lt;de_para&gt;(conf_path)</span>编译通过，大家能帮忙解释下不？<br /><br /><div>欢迎大家访问我们的开源项目,关于粒子群演化算法的库,多多提意见--<a href="http://code.google.com/p/stupidalgorithm/">http://code.google.com/p/stupidalgorithm/</a></div><img src ="http://www.cppblog.com/zhujian/aggbug/150555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-07-09 22:52 <a href="http://www.cppblog.com/zhujian/archive/2011/07/09/template.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求解负载均衡算法</title><link>http://www.cppblog.com/zhujian/archive/2011/03/22/load.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Tue, 22 Mar 2011 01:49:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/03/22/load.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/142449.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/03/22/load.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/142449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/142449.html</trackback:ping><description><![CDATA[ 这段时间要写服务器负载均衡算法和调度策略，但我没有接触过这方面的知识，网上有很多方法，如 轮循法，加权轮循法，最小连接数调度等方法，我想用加权轮循，但对权植和如何分配服务器不太清楚，有谁了解的请教下，不胜感激....<img src ="http://www.cppblog.com/zhujian/aggbug/142449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-03-22 09:49 <a href="http://www.cppblog.com/zhujian/archive/2011/03/22/load.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win7 利用live CD修复grub </title><link>http://www.cppblog.com/zhujian/archive/2011/03/21/win7grub.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Mon, 21 Mar 2011 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/03/21/win7grub.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/142416.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/03/21/win7grub.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/142416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/142416.html</trackback:ping><description><![CDATA[
<div>前几天安装了win7,挺好用的,比xp用起来还是舒服多了,装完后ubuntu系统进不了了,几经折腾终于搞定,记载下...同时也告诫自己,系统遇到问题了要有耐心,慢慢总会找到解决方法的,怎么也比重装来的快,废话少说啦...<br><br>1. 用ubuntu live CD启动,打开终端.<br><br>2. 网上说的方法大致是:<br><br>&nbsp;&nbsp; sudo grub<br>&nbsp;&nbsp; grub&gt;find /boot/stage1 &nbsp;----&gt;输出(hdx,y)<br>&nbsp;&nbsp; grub&gt;root (hdx,y)<br>&nbsp;&nbsp; grub&gt;setup (hd0)<br>&nbsp;&nbsp; grub&gt;quit<br><br>但是我按照上面的方法 不是说file not found就是no device.然后运行了sudo grub-install --root-directory=/mnt /dev/sda 命令,再次执行上面步骤,成功.reboot<br><br>如果重启后系统出现grub,那么你是幸运的,我没那么幸运,系统进入grub命令模式, :-( grub&gt;<br><br>这时候就要用到grub命令了,其实这时即可以进win7也可以进ubuntu,进ubuntu修复grub吧,命令如下<br><br>grub&gt; find /boot/grub/core.img &nbsp;----&gt; (hdx,y)<br>grub&gt; root (hdx,y)<br>grub&gt; kernel /boot/grub/core.img<br>grub&gt; boot<br><br>这下就会启动linux,进入终端,输入sudo grub-install /dev/sda,OK<br><br>如果要进入win7,输入如下命令即可:<br>grub&gt; rootnoverify (hd0,0)<br>grub&gt; chainloader +1<br>grub&gt; boot<br><br>:-)</div><br><img src ="http://www.cppblog.com/zhujian/aggbug/142416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-03-21 22:47 <a href="http://www.cppblog.com/zhujian/archive/2011/03/21/win7grub.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pimp idiom降低程序偶合</title><link>http://www.cppblog.com/zhujian/archive/2011/01/16/pimp.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Sun, 16 Jan 2011 08:42:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/01/16/pimp.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/138602.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/01/16/pimp.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/138602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/138602.html</trackback:ping><description><![CDATA[
pimp idiom的详细说明可以访<a href="http://www.gotw.ca/gotw/024.htm" title="pimp idiom">http://www.gotw.ca/gotw/024.htm</a>(这个网站好像被墙了，很讽刺)，其实就是将定义与实现分开。<br><br>在我博客上一篇随笔《关于高内聚低偶合》提到的问题，pimp idiom对降低程序偶合有一定的帮助，下面是我的理解思路，大家有好的意见或者更好的方法可以一起讨论下:<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&#160;1</span>&#160;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;Para_Base<br></span><span style="color: #008080; ">&#160;2</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&#160;3</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000; "><br></span><span style="color: #008080; ">&#160;4</span>&#160;<span style="color: #008000; "></span><span style="color: #000000; ">};<br></span><span style="color: #008080; ">&#160;5</span>&#160;<span style="color: #000000; "><br></span><span style="color: #008080; ">&#160;6</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;GA_Para<br></span><span style="color: #008080; ">&#160;7</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;Para_Base<br></span><span style="color: #008080; ">&#160;8</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&#160;9</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000; "><br></span><span style="color: #008080; ">10</span>&#160;<span style="color: #008000; "></span><span style="color: #000000; ">};<br></span><span style="color: #008080; ">11</span>&#160;<span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;Alg_Base<br></span><span style="color: #008080; ">13</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">14</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">15</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;Alg_Base(Para_Base&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)<br></span><span style="color: #008080; ">16</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;:m_pPara(p)&#160;{&#160;}<br></span><span style="color: #008080; ">17</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000; "><br></span><span style="color: #008080; ">18</span>&#160;<span style="color: #008000; "></span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">19</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;Para_Base&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">m_pPara;<br></span><span style="color: #008080; ">20</span>&#160;<span style="color: #000000; ">};<br></span><span style="color: #008080; ">21</span>&#160;<span style="color: #000000; "><br></span><span style="color: #008080; ">22</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;GA_Alg<br></span><span style="color: #008080; ">23</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;Alg_Base<br></span><span style="color: #008080; ">24</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">25</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif">&#160;&#160;&#160;&#160;</span><span style="color: #008000; "><br></span><span style="color: #008080; ">26</span>&#160;<span style="color: #008000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">27</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;GA_Alg(GA_Para&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pGA)<br></span><span style="color: #008080; ">28</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;:Alg_Base(pGA)&#160;{&#160;}<br></span><span style="color: #008080; ">29</span>&#160;<span style="color: #000000; ">};</span></div><br>参数基类Para_Base和特定的算法参数类GA_Para都没有改变。<br><br>算法基类Alg_Base的模板去掉了，同时添加了一个指向参数基类Para_Base的指针成员变量，而以前用的是模板指针。并且修改了构造函数，构造函数接受一个指向Para_Base的指针并赋给m_pPara。<br><br>特定算法类GA_Alg继承自算法基类Alg_Base，但修改了构造函数，接受指向GA_Para的一个指针，然后调用父类Alg_Base的构造函数，这样的结果便是m_pPara指向的是GA_Para实例，等价于Para_Base *m_pPara = new GA_Para();<br><br>相对于上一篇提到的模板实现，pimp idiom的偶合更低些，而且pimp idiom应用也非常广泛。<br> <img src ="http://www.cppblog.com/zhujian/aggbug/138602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-01-16 16:42 <a href="http://www.cppblog.com/zhujian/archive/2011/01/16/pimp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于高内聚低偶合</title><link>http://www.cppblog.com/zhujian/archive/2011/01/13/stupidAlg.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Thu, 13 Jan 2011 12:43:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/01/13/stupidAlg.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/138478.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/01/13/stupidAlg.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/138478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/138478.html</trackback:ping><description><![CDATA[最近遇到的一个问题，大伙来讨论一下，希望得到高手的指点，代码的结构是这样的：<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&#160;1</span>&#160;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;Para_Base<br></span><span style="color: #008080; ">&#160;2</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&#160;3</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;<br></span><span style="color: #008080; ">&#160;4</span>&#160;<span style="color: #000000; ">};<br></span><span style="color: #008080; ">&#160;5</span>&#160;<span style="color: #000000; "><br></span><span style="color: #008080; ">&#160;6</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;GA_Para<br></span><span style="color: #008080; ">&#160;7</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;Para_Base<br></span><span style="color: #008080; ">&#160;8</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&#160;9</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br></span><span style="color: #008080; ">10</span>&#160;<span style="color: #000000; ">};<br></span><span style="color: #008080; ">11</span>&#160;<span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&#160;<span style="color: #000000; ">template&#160;</span><span style="color: #000000; "><</span><span style="color: #000000; ">typename&#160;Para_Type</span><span style="color: #000000; ">></span><span style="color: #000000; "><br></span><span style="color: #008080; ">13</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;Alg_Base<br></span><span style="color: #008080; ">14</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">15</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000; "><br></span><span style="color: #008080; ">16</span>&#160;<span style="color: #008000; "></span><span style="color: #000000; ">&#160;&#160;&#160;&#160;shared_ptr</span><span style="color: #000000; "><</span><span style="color: #000000; ">Para_Type</span><span style="color: #000000; ">></span><span style="color: #000000; ">&#160;m_pPara;<br></span><span style="color: #008080; ">17</span>&#160;<span style="color: #000000; ">};<br></span><span style="color: #008080; ">18</span>&#160;<span style="color: #000000; "><br></span><span style="color: #008080; ">19</span>&#160;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;GA_Alg<br></span><span style="color: #008080; ">20</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;Alg_Base</span><span style="color: #000000; "><</span><span style="color: #000000; ">GA_Para</span><span style="color: #000000; ">></span><span style="color: #000000; "><br></span><span style="color: #008080; ">21</span>&#160;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">22</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;<br></span><span style="color: #008080; ">23</span>&#160;<span style="color: #000000; ">}</span></div><br>解释一下，一个参数基类，是各种算法参数的公共基类，第二个类是GA算法的参数类，继承自Para_Base,第三个类是各种算法的基类，是个模板类，模板参数类型是算法参数类型，如GA_Para，第4个类是GA算法类，继承自Alg_Base<GA_Para>，这样m_pPara对不同的算法指向不同的参数，但这样改动一下代码，程序得从头重新编译，因为程序库的确比较大，编译起来挺花时间的，(这是师兄带我写的一个智能演化算法的库，即将完成，我们打算开源，完成后再通告大家）大家有没有更好的设计方法，比如把定义与实现分开，还望大家多发表些意见，不胜感激。<br><br><br><br> <img src ="http://www.cppblog.com/zhujian/aggbug/138478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-01-13 20:43 <a href="http://www.cppblog.com/zhujian/archive/2011/01/13/stupidAlg.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost program_options(续)</title><link>http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options2.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Thu, 13 Jan 2011 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options2.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/138459.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options2.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/138459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/138459.html</trackback:ping><description><![CDATA[下面介绍如何从配置文件中读参数,配置文件中采用name = value的形式,#行表示注释.<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">program_options.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#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: #008080; ">&nbsp;4</span>&nbsp;<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></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">#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></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">#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: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">fstream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::copy;<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::vector;<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::cout;<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::cerr;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::endl;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::exception;<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::ostream;<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::ifstream;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::ostream_iterator;<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;po</span><span style="color: #000000; ">=</span><span style="color: #000000; ">boost::program_options;<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;output&nbsp;vector.</span><span style="color: #008000; "><br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</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: #008080; ">24</span>&nbsp;<span style="color: #000000; ">ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">(ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;os,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v)<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;copy(v.begin(),&nbsp;v.end(),&nbsp;ostream_iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(os,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;os;<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; "></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; ">argv[])<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; "><br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;conf_file;<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::options_description&nbsp;desc(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">general&nbsp;descriptions.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desc.add_options()<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">help</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">generate&nbsp;help&nbsp;information</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">config,c</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;po::value</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; ">&amp;</span><span style="color: #000000; ">conf_file)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">default_value(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">compiler.conf</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">compiler&nbsp;configure&nbsp;file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;po::value</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input&nbsp;files</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link-file,l</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;po::value</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">()</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">composing(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link&nbsp;file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::positional_options_description&nbsp;p;<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.add(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::variables_map&nbsp;vm;<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">po::store(po::parse_command_line(argc,&nbsp;argv,&nbsp;desc),&nbsp;vm);</span><span style="color: #008000; "><br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::store(po::command_line_parser(argc,&nbsp;argv).options(desc).positional(p).run(),&nbsp;vm);<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::notify(vm);<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(vm.count(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">help</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">desc</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;add&nbsp;following&nbsp;lines</span><span style="color: #008000; "><br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifstream&nbsp;i_conf(conf_file.c_str());<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&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; ">i_conf)<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cerr</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Configure&nbsp;file&nbsp;not&nbsp;exit.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::store(po::parse_config_file(i_conf,&nbsp;desc),&nbsp;vm);<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notify(vm);<br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(vm.count(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Input&nbsp;files:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">vm[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">].</span><span style="color: #0000FF; ">as</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">()<br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(vm.count(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Link&nbsp;file:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">vm[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">].</span><span style="color: #0000FF; ">as</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">()<br></span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">81</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(exception</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;e)<br></span><span style="color: #008080; ">83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">e.what()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br></span><span style="color: #008080; ">85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">87</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">88</span>&nbsp;<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></span><span style="color: #008080; ">89</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">90</span>&nbsp;<span style="color: #000000; "></span></div><br>第38行添加了config参数命令,接受一个string类型值,并将默认值设为compiler.conf.<br>第40行添加了composing()方法,这表示程序将从不同的数据源中获得数据并组合起来.<br>第66行解析配置文件并存储至vm.<br>接下来代码便是比对vm中选项值,简单吧:)<br><br>boost文档里介绍了隐藏选项和存放多姐选项的方法,<meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://www.boost.org/doc/libs/1_45_0/doc/html/program_options/tutorial.html#id2073299">http://www.boost.org/doc/libs/1_45_0/doc/html/program_options/tutorial.html#id2073299</a><br><br><br><br><br><br>
<img src ="http://www.cppblog.com/zhujian/aggbug/138459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-01-13 13:17 <a href="http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost program_options</title><link>http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Thu, 13 Jan 2011 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/138408.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/138408.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/138408.html</trackback:ping><description><![CDATA[

boost program_options库可以帮助我们解析程序参数,支持命令行形式和配置文件形式,获得(name, value)对.下面我们以一个模拟编译器例子介绍program_options库的应用,在下一节继续介绍program_options整个库.<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">program_options.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#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: #008080; ">&nbsp;4</span>&nbsp;<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></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">#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></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">#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: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::copy;<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::vector;<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::cout;<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::endl;<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::exception;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::ostream;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;std::ostream_iterator;<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;po</span><span style="color: #000000; ">=</span><span style="color: #000000; ">boost::program_options;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;output&nbsp;vector.</span><span style="color: #008000; "><br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</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: #008080; ">21</span>&nbsp;<span style="color: #000000; ">ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">(ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;os,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v)<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;copy(v.begin(),&nbsp;v.end(),&nbsp;ostream_iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(os,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;os;<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; "></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; ">argv[])<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; "><br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::options_description&nbsp;desc(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">general&nbsp;descriptions.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desc.add_options()<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">help</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">generate&nbsp;help&nbsp;information</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;po::value</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input&nbsp;files</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link-file,l</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;po::value</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link&nbsp;file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::variables_map&nbsp;vm;<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::store(po::parse_command_line(argc,&nbsp;argv,&nbsp;desc),&nbsp;vm);<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;po::notify(vm);<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(vm.count(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">help</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">desc</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(vm.count(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Input&nbsp;files:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">vm[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">].</span><span style="color: #0000FF; ">as</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">()<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(vm.count(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Link&nbsp;file:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">vm[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">link-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">].</span><span style="color: #0000FF; ">as</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">()<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(exception</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;e)<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">e.what()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">65</span>&nbsp;<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></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; "></span></div><br>程序第20行重载了&lt;&lt;运算符,用于输出vector数组.<br>第31行定义一个选项描述组件,然后添加允许的选项,add_options()方法返回一个特定对象,该对象重载了()运算.link-file选项指定了短名l,这样--link-file与-l一个意思.<br>第37行定义一个存储器组件对象vm.<br>第38行分析器parse_command_line将选项描述存储至vm,这里用到的分析器很简单,后面会介绍更复杂的应用.<br><br>接下来的代码就是比对vm中存放的选项了,简单吧,很好理解.下面是运行截图,编译需要添加boost program_options库,即-lboost_program_option<br><img src="http://www.cppblog.com/images/cppblog_com/zhujian/Screenshot2.png" id="" width="800" height="76" vspace="0" hspace="0" border="" align="baseline" alt="" longdesc=""><br>对于input-file选项,每次都要输出--input-file真的很麻烦,能不能用compiler main.cpp呢,当然可以.这种选项叫做positional option, 在第36行处加上如下代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #000000; ">po::positional_options_description&nbsp;p;<br></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.add(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input-file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; "></span></div><br>修改第38行,我们要用到功能更强大的command_line_parse,改成如下:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">&nbsp;po::store(po::command_line_parser(argc,&nbsp;argv).options(desc).positional(p).run(),&nbsp;vm);</span></div>编译运行:看下结果吧<br><img src="http://www.cppblog.com/images/cppblog_com/zhujian/Screenshot3.png" id="" width="800" height="70" vspace="0" hspace="0" border="" align="baseline" alt="" longdesc=""><br>先到这里吧,接下来再看从文件中读选项:)<br><br><br><img src ="http://www.cppblog.com/zhujian/aggbug/138408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-01-13 11:17 <a href="http://www.cppblog.com/zhujian/archive/2011/01/13/boost_program_options.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost any</title><link>http://www.cppblog.com/zhujian/archive/2011/01/11/boost_any.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Tue, 11 Jan 2011 06:16:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/01/11/boost_any.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/138323.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/01/11/boost_any.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/138323.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/138323.html</trackback:ping><description><![CDATA[




boost any库可以在如下三方面改善你的程序：(1)任意类型的类型安全存储以及安全的取回；(2)在标准库容器中存放不同类型的方法；(3)可以在无须知道类型的情况下传送类型。<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">boost::any&nbsp;a;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">定义any对象</span><span style="color: #008000; "><br></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">boost&nbsp;any</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">any重载了模板赋值函数</span><span style="color: #008000; "><br></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">3.1415</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">15</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;<br></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; ">std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;s(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">any&nbsp;type</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">boost::any&nbsp;b(s);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">any的模板构造函数<br></span><span style="color: #008080; ">8</span>&nbsp;<span style="color: #008000; "></span></div><br>从any对象中取出存放数据要借助普通模板函数any_cast,取回数据也很简单.<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;ss</span><span style="color: #000000; ">=</span><span style="color: #000000; ">boost::any_cast</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; ">(b);</span></div><br>如果类型不符any_cast会抛出一个bad_any_cast异常,该异常继承自std::bad_cast.同时any对象有type()成员函数,可以比较类型后再进行类型转换.<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(a.type()</span><span style="color: #000000; ">==</span><span style="color: #000000; ">typeid(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">boost::any_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(a);<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">do&nbsp;something</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(a.type()</span><span style="color: #000000; ">==</span><span style="color: #000000; ">typeid(std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">))<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;s</span><span style="color: #000000; ">=</span><span style="color: #000000; ">boost::any_cast</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; ">(a);<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">do&nbsp;something</span><span style="color: #008000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; "><br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;d</span><span style="color: #000000; ">=</span><span style="color: #000000; ">boost::any_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(a);<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">do&nbsp;something</span><span style="color: #008000; "><br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(std::bad_cast</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;bc)<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Oops!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">do&nbsp;something</span><span style="color: #008000; "><br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "></span></div><br>说明:any类成员函数empty()用于判断对象中是否为空,在用any存放指针时要特别注意,any不保证指针非空,即存放空指针时empty()返回还是false.看如下代码片段便知:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">p;<br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(!a.empty())<br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a&nbsp;is not empty.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a&nbsp;is empty.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span></div>输出结果为 a is not empty.所以我们要额外判断指针是否为空.<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&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; ">a.empty())<br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(boost::any_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*&gt;</span><span style="color: #000000; ">(a)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a&nbsp;is&nbsp;not&nbsp;empty.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">null&nbsp;pointer.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a&nbsp;is&nbsp;empty.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span></div><br>any存放类指针支持多态.<br><br><br><img src ="http://www.cppblog.com/zhujian/aggbug/138323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-01-11 14:16 <a href="http://www.cppblog.com/zhujian/archive/2011/01/11/boost_any.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost progress</title><link>http://www.cppblog.com/zhujian/archive/2011/01/10/Boost.html</link><dc:creator>逐渐</dc:creator><author>逐渐</author><pubDate>Mon, 10 Jan 2011 11:20:00 GMT</pubDate><guid>http://www.cppblog.com/zhujian/archive/2011/01/10/Boost.html</guid><wfw:comment>http://www.cppblog.com/zhujian/comments/138299.html</wfw:comment><comments>http://www.cppblog.com/zhujian/archive/2011/01/10/Boost.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhujian/comments/commentRss/138299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhujian/services/trackbacks/138299.html</trackback:ping><description><![CDATA[

boost progress包括progress_timer, progress_display,分别用于输出程序运行的时间和显示运行进度.<div><span style="font-family: monospace; font-size: 13px; white-space: pre; "><span style="color: rgb(0, 128, 128); "> 1</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); "> 2</span> <span style="color: rgb(0, 0, 0); ">#include </span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">boost</span><span style="color: rgb(0, 0, 0); ">/</span><span style="color: rgb(0, 0, 0); ">progress.hpp</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); "> 3</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); "> 4</span> <span style="color: rgb(0, 0, 0); ">#include </span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">iostream</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); "> 5</span> <span style="color: rgb(0, 0, 0); ">#include </span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">vector</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); "> 6</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); "> 7</span> <span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 255); ">using</span><span style="color: rgb(0, 0, 0); "> std::cout;
</span><span style="color: rgb(0, 128, 128); "> 8</span> <span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 255); ">using</span><span style="color: rgb(0, 0, 0); "> std::endl;
</span><span style="color: rgb(0, 128, 128); "> 9</span> <span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 255); ">using</span><span style="color: rgb(0, 0, 0); "> std::vector;
</span><span style="color: rgb(0, 128, 128); ">10</span> <span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 255); ">using</span><span style="color: rgb(0, 0, 0); "> boost::progress_display;
</span><span style="color: rgb(0, 128, 128); ">11</span> <span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 255); ">using</span><span style="color: rgb(0, 0, 0); "> boost::progress_timer;
</span><span style="color: rgb(0, 128, 128); ">12</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); ">13</span> <span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); "> main()
</span><span style="color: rgb(0, 128, 128); ">14</span> <span style="color: rgb(0, 0, 0); ">{
</span><span style="color: rgb(0, 128, 128); ">15</span> <span style="color: rgb(0, 0, 0); ">    vector</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); "> v;
</span><span style="color: rgb(0, 128, 128); ">16</span> <span style="color: rgb(0, 0, 0); ">    </span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); "> i;
</span><span style="color: rgb(0, 128, 128); ">17</span> <span style="color: rgb(0, 0, 0); ">    </span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">(i</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">; i</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">10</span><span style="color: rgb(0, 0, 0); ">; i</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">)
</span><span style="color: rgb(0, 128, 128); ">18</span> <span style="color: rgb(0, 0, 0); ">        v.push_back(i);
</span><span style="color: rgb(0, 128, 128); ">19</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); ">20</span> <span style="color: rgb(0, 0, 0); ">    progress_display display(v.size());
</span><span style="color: rgb(0, 128, 128); ">21</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); ">22</span> <span style="color: rgb(0, 0, 0); ">    vector</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">::iterator it;
</span><span style="color: rgb(0, 128, 128); ">23</span> <span style="color: rgb(0, 0, 0); ">    progress_timer elapsed;
</span><span style="color: rgb(0, 128, 128); ">24</span> <span style="color: rgb(0, 0, 0); ">    </span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">(it</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">v.begin(); it</span><span style="color: rgb(0, 0, 0); ">!=</span><span style="color: rgb(0, 0, 0); ">v.end(); </span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">it)
</span><span style="color: rgb(0, 128, 128); ">25</span> <span style="color: rgb(0, 0, 0); ">    {
</span><span style="color: rgb(0, 128, 128); ">26</span> <span style="color: rgb(0, 0, 0); ">        </span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">do something </span><span style="color: rgb(0, 128, 0); ">
</span><span style="color: rgb(0, 128, 128); ">27</span> <span style="color: rgb(0, 128, 0); "></span><span style="color: rgb(0, 0, 0); ">        </span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">display;
</span><span style="color: rgb(0, 128, 128); ">28</span> <span style="color: rgb(0, 0, 0); ">    }
</span><span style="color: rgb(0, 128, 128); ">29</span> <span style="color: rgb(0, 0, 0); ">
</span><span style="color: rgb(0, 128, 128); ">30</span> <span style="color: rgb(0, 0, 0); ">    cout</span><span style="color: rgb(0, 0, 0); ">&lt;&lt;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">elapsed time: </span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">;
</span><span style="color: rgb(0, 128, 128); ">31</span> <span style="color: rgb(0, 0, 0); ">    </span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); "> </span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;
</span><span style="color: rgb(0, 128, 128); ">32</span> <span style="color: rgb(0, 0, 0); ">}</span></span></div><div><font face="monospace" size="3"><span style="font-size: 13px; white-space: pre;">程序运行结果截图:</span></font></div><div><font face="monospace" size="3"><span style="font-size: 13px; white-space: pre;"><span style="font-family: 'MS Sans Serif'; white-space: normal; font-size: 9px; "><img id="preview_image" src="http://www.cppblog.com/images/cppblog_com/zhujian/Screenshot.png" align="baseline" width="545" height="85"></span></span></font></div><div><font face="monospace" size="3"><span style="font-size: 13px; white-space: pre;"><span style="font-family: 'MS Sans Serif'; white-space: normal; font-size: 9px; ">说明:progress_display重载了operator++,progress_timer在定义时开始计时,对象析构时输出所耗时间.</span></span></font></div><img src ="http://www.cppblog.com/zhujian/aggbug/138299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhujian/" target="_blank">逐渐</a> 2011-01-10 19:20 <a href="http://www.cppblog.com/zhujian/archive/2011/01/10/Boost.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>