﻿<?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++博客-CPP&amp;&amp;设计模式小屋-随笔分类-STL,Generic Programming</title><link>http://www.cppblog.com/shenhuafeng/category/2578.html</link><description>(STL,Templete,Generric Programming COM,COM+,ActiveX)---Windows &amp;&amp; Linux &amp;&amp;OpenSource
</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 18:32:25 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 18:32:25 GMT</pubDate><ttl>60</ttl><item><title>Boost库编译</title><link>http://www.cppblog.com/shenhuafeng/archive/2006/11/27/15703.html</link><dc:creator>CPP&amp;&amp;设计模式小屋</dc:creator><author>CPP&amp;&amp;设计模式小屋</author><pubDate>Mon, 27 Nov 2006 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/shenhuafeng/archive/2006/11/27/15703.html</guid><wfw:comment>http://www.cppblog.com/shenhuafeng/comments/15703.html</wfw:comment><comments>http://www.cppblog.com/shenhuafeng/archive/2006/11/27/15703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shenhuafeng/comments/commentRss/15703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shenhuafeng/services/trackbacks/15703.html</trackback:ping><description><![CDATA[在Visual Studio .NET 2003 命令提示下进入boost目录，如何进入tools\build\jam_src\，执行build.bat，编译成功得到bjam.exe<br /><br />接着copy bjam.exe到 boost目录，执行bjam -sBOOST_ROOT=. -sTOOLS=vc7 "-sBUILD=debug release &lt;runtime-link&gt;static/dynamic"<br /><br />漫长的等待后会在boost目录下的bin文件夹中生产一堆lib,复制到sdk的lib路径下，将boost目录添加的工程中。ok<img src ="http://www.cppblog.com/shenhuafeng/aggbug/15703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shenhuafeng/" target="_blank">CPP&&设计模式小屋</a> 2006-11-27 18:19 <a href="http://www.cppblog.com/shenhuafeng/archive/2006/11/27/15703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Modern C++ Design 学习笔记之Policy Based Class Design</title><link>http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12426.html</link><dc:creator>CPP&amp;&amp;设计模式小屋</dc:creator><author>CPP&amp;&amp;设计模式小屋</author><pubDate>Wed, 13 Sep 2006 15:22:00 GMT</pubDate><guid>http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12426.html</guid><wfw:comment>http://www.cppblog.com/shenhuafeng/comments/12426.html</wfw:comment><comments>http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12426.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/shenhuafeng/comments/commentRss/12426.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shenhuafeng/services/trackbacks/12426.html</trackback:ping><description><![CDATA[
		<p>版权所有 未经作者允许 不得用于商业用途 转载请附带这第一,二行<br /><a href="/shenhuafeng/">http://www.cppblog.com/shenhuafeng/</a></p>
		<p>Modern C++ Design的第一章就是Policy Based Class Design,可见该技术是整个Loki库的设计基础.这种方式的优点是能够增加程序库的弹性和提高复用性.<br />简单来说就是,一个Policy Based Class由很多基本的Policy来组成的,每个Policy Class代表了该复杂类(相对复杂)类的某些行为或者特性.有点类似于类的继承，当然和类的继承是不同的。<br />那么Policy Based Class有什么用呢？我们先看下面这个问题。<br />假如需要设计一个基础库，可能是基于某个特定领域的，那么库的设计者就需要考虑这样的问题，他需要将未来的可能的需求加以分类，抽象出层次，然后运用OO思想，希望能够构造出一个开发的结构，当然其中的component的设计当然是越是灵活越好。<br />用传统的OO设计思想，可能可以设计出一套非常完善的类库 ，可能包罗万象。当然的对于应用开发人员需要花很多时间去学习这个“包罗万象”的基础类库。而且往往这样的基础库不是通用性不强就是限制条件太多（例如MFC）可以说就是这样一种类型的库。</p>
		<p>下面要展示一下运用多重继承以及Templetes来实现的policy class,举一个简单的例子：<br />假如我们需要发明一个灯，它有不同的种类，有使用不同能源的工作方式以及有不同的操作方式，如果运用</p>
		<p>policy based class来设计的话，可能是这样的结构：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">templete</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> T,<br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    templete </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Work,<br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    templete </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> OpMethod<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Light<br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    :</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> Work</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">T</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">,<br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        OpMethod</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Light</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_134_204_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_204_Open_Text.style.display='none'; Codehighlighter1_134_204_Closed_Image.style.display='inline'; Codehighlighter1_134_204_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_134_204_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_204_Closed_Text.style.display='none'; Codehighlighter1_134_204_Open_Image.style.display='inline'; Codehighlighter1_134_204_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_134_204_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_134_204_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    T</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> xxOp()<br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_148_202_Open_Image" onclick="this.style.display='none'; Codehighlighter1_148_202_Open_Text.style.display='none'; Codehighlighter1_148_202_Closed_Image.style.display='inline'; Codehighlighter1_148_202_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_148_202_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_148_202_Closed_Text.style.display='none'; Codehighlighter1_148_202_Open_Image.style.display='inline'; Codehighlighter1_148_202_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_148_202_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_148_202_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(Work(T).Status </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> ACMODE)<br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            OpMethod(</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />当你实例化一个Policy Based Class的时候，你还可以给出默认的实现，就像成员函数声明和定义时候给出的默认参数一样。</p>
		<p>回头来看一下多重继承和Templetes的特性：<br />多重继承：欠缺一种一成不变的可以套用的代码，在某种受控的情况下将继承的Class组合起来（多重继承只是将他们放在一起，然后提供一种访问方式）。Templetes：有这样的特性。<br />多重继承由于继承自多个Base Class，所以型别信息缺乏，而Templetes正式基于型别的。<br />多重继承容易扩张，而Templetes的特化不容易扩张。</p>
		<p>正是两项技术的互补，才使这样的技术实现成为可能。<br />Light对象继承多个policy class,使得特性得以在编译期间定值，从而实现Light Class功能的扩张。<br />而Templetes技术使得大部分Work以及OpMethod能够共享大部分基础代码，而对特定的版本实现定值。</p>
		<p>这样的好处就是，应用程序开发人员得以在应用设计时期，使用这些Class，选择适合自己的Policy组装自己的代码，从而使得程序大小得以精减，运行速率得以提高，而不必去包含整个又大又全的基础类库。</p>
		<p>以上只是一些学习的心得和体会，如果有不对的地方，希望大家多多指教。</p>
<img src ="http://www.cppblog.com/shenhuafeng/aggbug/12426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shenhuafeng/" target="_blank">CPP&&设计模式小屋</a> 2006-09-13 23:22 <a href="http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Loki库的学习心得</title><link>http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12402.html</link><dc:creator>CPP&amp;&amp;设计模式小屋</dc:creator><author>CPP&amp;&amp;设计模式小屋</author><pubDate>Wed, 13 Sep 2006 03:32:00 GMT</pubDate><guid>http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12402.html</guid><wfw:comment>http://www.cppblog.com/shenhuafeng/comments/12402.html</wfw:comment><comments>http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shenhuafeng/comments/commentRss/12402.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shenhuafeng/services/trackbacks/12402.html</trackback:ping><description><![CDATA[前段时间刚刚看完STL源代码解析,觉得受益非浅,不过总体来说STL的源代码还是比较浅显易懂的.最近学习Andrei Alexandrescu的Modern C++ Design,随后从网站上下载了Loki库的源代码,发觉还是有些难度的,准备将学习的点滴记录于此,每天写篇学习心得,也算是给自己一个学习的动力吧.<img src ="http://www.cppblog.com/shenhuafeng/aggbug/12402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shenhuafeng/" target="_blank">CPP&&设计模式小屋</a> 2006-09-13 11:32 <a href="http://www.cppblog.com/shenhuafeng/archive/2006/09/13/12402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>