﻿<?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++博客-小山日志-随笔分类-stl/boost/loki/generically</title><link>http://www.cppblog.com/nj-blog/category/2417.html</link><description>读书,学习与思考.</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 20:10:24 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 20:10:24 GMT</pubDate><ttl>60</ttl><item><title>Scott Meyers最近一次Aha！时刻</title><link>http://www.cppblog.com/nj-blog/archive/2006/11/03/14595.html</link><dc:creator>小山日志</dc:creator><author>小山日志</author><pubDate>Thu, 02 Nov 2006 17:10:00 GMT</pubDate><guid>http://www.cppblog.com/nj-blog/archive/2006/11/03/14595.html</guid><wfw:comment>http://www.cppblog.com/nj-blog/comments/14595.html</wfw:comment><comments>http://www.cppblog.com/nj-blog/archive/2006/11/03/14595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/nj-blog/comments/commentRss/14595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/nj-blog/services/trackbacks/14595.html</trackback:ping><description><![CDATA[    孟岩在自己的blog上<a title="提到了" href="http://blog.csdn.net/myan/archive/2006/09/17/1232960.aspx">提到了</a> Scott Meyers在Artima.com的C++ Source栏目中发表的一个5×5的系列。其中最后一篇是Scott Meyers的<a title="五个最重要的C++Aha！时刻" href="http://www.artima.com/cppsource/top_cpp_aha_moments.html">五个最重要的C++Aha！时刻</a> ，孟岩提示大家关注最后一个。如果关注过Scott Meyers和他的Effectiv系列的话，对他前四个Aha！时刻应该都已经熟识了。<br /><div>    这里仅翻译第五个：<br /><h3>明白Boost的<span style="FONT-STYLE: italic">shared_ptr</span>里<span style="FONT-STYLE: italic">deleter</span>是如何工作的，2004 </h3>Boost的引用计数智能指针shared_ptr有一个有趣的特性，你可以传入一个函数或者一个函数体，并且当引<br />用计数为零时，它会对指向的对象调用这个deleter。让人脸红的是，这看起来很平凡，但是请看这段代码：<br /><br /><span style="COLOR: rgb(0,153,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,153,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,0)"><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: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename  T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">  shared_ptr {<br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br />    template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename U, typename D</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">explicit</span><span style="COLOR: #000000">  shared_ptr(U</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> ptr, D deleter);<br />    <img src="http://www.cppblog.com/images/dot.gif" /><br />};<br /></span></div><br /></span></span></span></span></span>要注意的是在析构的期间shared_ptr&lt;T&gt;必须为类型为D的deleter做些安排，以确保它的调用，然而shared_ptr&lt;T&gt;并不知道类型D到底是什么。此对象不能包含类型为D的数据成员，当然也不能有一个指向类型为D的对象的指针，因为当对象成员数据声明的时候对于D好不知情。那么shared_ptr对象如何在构造期deleter被传入时保存它的踪迹，并且在稍后的析构期使用它的呐？更一般的说法，在一个对象的构造期间构造函数如何获得未知类型的信息，并把类型的信息传给此对象，而对象不能保存关于此类型任何提示。<br /><br />答案很简单：此对象包含一个已知类型的基类指针（Boost管它叫做 sp_counted_base ），指向一个已经构造实例化的模板，此模板继承自前面的基类，并使用D作为实例化参数（Boost使用模板 sp_counted_impl_p 和 sp_counted_impl_pd ），使用一个在基类里声明，继承类中定义的虚函数来调用 deleter （Boost使用 dispose ）。稍微简化了，它看起来像下面这样：<br />                            <img height="156" src="http://docs.google.com/File?id=dcjhdv5v_16f63d7b" width="343" align="absMiddle" /> <br />它是很明显的，只要你看过它一次。但是只要你看过它一次，你就会体会到它可以被用到很多种类的地方，它打开了模板设计的新视野，模板化类使用相对较少的模板参数（shared_ptr 只是其中一个）可以引用不受数量限制的当前不知名类型的信息。当我意识到我接近的东西，我不能禁止地露出赞赏的笑容并摇晃我的脑袋。<br /><br /></div><img src ="http://www.cppblog.com/nj-blog/aggbug/14595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nj-blog/" target="_blank">小山日志</a> 2006-11-03 01:10 <a href="http://www.cppblog.com/nj-blog/archive/2006/11/03/14595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost/utility里有些什么?(2)</title><link>http://www.cppblog.com/nj-blog/archive/2006/08/16/11264.html</link><dc:creator>小山日志</dc:creator><author>小山日志</author><pubDate>Tue, 15 Aug 2006 16:24:00 GMT</pubDate><guid>http://www.cppblog.com/nj-blog/archive/2006/08/16/11264.html</guid><wfw:comment>http://www.cppblog.com/nj-blog/comments/11264.html</wfw:comment><comments>http://www.cppblog.com/nj-blog/archive/2006/08/16/11264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/nj-blog/comments/commentRss/11264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/nj-blog/services/trackbacks/11264.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span lang="EN-US">2.<strong></strong></span>
				<strong>
						<span style="font-weight: normal; font-family: 宋体;">函数模板</span>
						<span lang="EN-US">checked_delete() </span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-family: 宋体;">和</span>
						<font color="#000000">
								<span lang="EN-US">checked_array_delete()</span>
						</font>
				</strong>
				<strong>
						<span style="font-weight: normal;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal">
				<strong>
						<span lang="EN-US">&lt;boost/checked_delete.hpp&gt;</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-family: 宋体;">定义了两个函数模板</span>
						<span lang="EN-US">checked_delete</span>
				</strong>
				<span lang="EN-US">
				</span>
				<span style="font-family: 宋体;">和</span>
				<strong>
						<span lang="EN-US">checked_array_delete</span>
				</strong>
				<strong>
						<span style="font-family: 宋体;">，</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-family: 宋体;">还有两个类模板</span>
						<span lang="EN-US">checked_deleter</span>
				</strong>
				<span lang="EN-US">
				</span>
				<span style="font-family: 宋体;">和</span>
				<strong>
						<span lang="EN-US">checked_array_deleter。</span>
				</strong>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">当我们利用指针删除一个对象的时候，对象类型是否完整决定了对象是否能够被正确删除。但是，如果你用</span>
				<span style="font-size: 13.5pt;">
				</span>
				<span style="font-family: 'Lucida Console';" lang="EN-US">delete</span>
				<span style="font-size: 13.5pt;" lang="EN-US">
				</span>
				<span style="font-family: 宋体;">去删除一个类型并不完整的对象的指针，编译器并不会给你提供任何错误信息（好吧，有些编译器会给出警告信息，但是程序员通常会忽略警告信息），但是这样做的结果却是对象的析构函数根本就没有被调用。</span>
				<span style="font-size: 13.5pt;">
						<u1:p>
						</u1:p>
				</span>
				<span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">所以，我们应当使用更严厉的手段禁止这种事情的发生。比如说使用</span>
				<span style="font-size: 13.5pt;">
				</span>
				<b>
						<span lang="EN-US">checked_delete</span>
				</b>
				<b>
						<span style="font-size: 13.5pt;" lang="EN-US">
						</span>
				</b>
				<span style="font-family: 宋体;">代替</span>
				<span style="font-size: 13.5pt;">
				</span>
				<b>
						<span lang="EN-US">delete</span>
				</b>
				<b>
						<span style="font-size: 13.5pt;" lang="EN-US">
						</span>
				</b>
				<span style="font-family: 宋体;">来删除指针。当指针所指向的是一个不完全类型时，</span>
				<span style="font-size: 13.5pt;">
				</span>
				<b>
						<span lang="EN-US">
						</span>
				</b>
				<span style="font-family: 宋体;">
				</span>
				<span style="font-size: 13.5pt;">
				</span>
				<b>
						<span lang="EN-US">checked_delete</span>
				</b>
				<b>
						<span style="font-size: 13.5pt;" lang="EN-US">
						</span>
				</b>
				<span style="font-family: 宋体;">
				</span>
				<span style="font-family: 宋体;">会使编译器发出错误信息。</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<b>
						<font size="3">
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);"> test；</span>
								<span style="color: rgb(0, 128, 0);">//</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 128, 0);">有声明，但是忘记了定义，或是忘记    <br />          </span>
								<span style="color: rgb(0, 128, 0);">//</span>
								<span style="color: rgb(0, 128, 0);">包含定义文件，test是一个不完全类型</span>
								<span style="color: rgb(0, 128, 0);">
								</span>
						</font>
						<span style="color: rgb(0, 0, 0);">
								<br />
								<font size="3">main()<br />{<br />test </font>
						</span>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">*</span>
								<span style="color: rgb(0, 0, 0);"> pt </span>
								<span style="color: rgb(0, 0, 0);">=</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);"> NULL;<br />delete pt;  </span>
								<span style="color: rgb(0, 128, 0);">//</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 128, 0);"> 有时会有警告信息，<br />            </span>
								<span style="color: rgb(0, 128, 0);">//</span>
								<span style="color: rgb(0, 128, 0);">但有时什么都没有。</span>
						</font>
						<span style="color: rgb(0, 128, 0);">
								<br />
						</span>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">checked_delete(pt); </span>
								<span style="color: rgb(0, 128, 0);">//</span>
								<span style="color: rgb(0, 128, 0);"> 发出错误信息。</span>
						</font>
						<span style="color: rgb(0, 128, 0);">
								<br />
						</span>
				</b>
				<span style="color: rgb(0, 0, 0);">
						<font size="3">
								<b>}</b>
								<br />
						</font>
				</span>
		</div>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">checked_array_delete</span>
				</b>
				<span style="font-family: 宋体;">是用来对应于</span>
				<b>
						<span lang="EN-US">delete [ ] operator</span>
				</b>
				<span style="font-family: 宋体;">，</span>
				<b>
						<span lang="EN-US">checked_deleter</span>
				</b>
				<span style="font-family: 宋体;">和</span>
				<b>
						<span lang="EN-US">checked_array_deleter</span>
				</b>
				<span style="font-family: 宋体;">是可以配接的仿函数版本。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">3.</span>
				<span style="font-family: 宋体;">函数模板</span>
				<b>
						<span lang="EN-US">next()</span>
				</b>
				<span style="font-family: 宋体;">和</span>
				<b>
						<span lang="EN-US">prior() <o:p></o:p></span>
				</b>
				<br />
				<span style="font-family: 宋体;">包括</span>
		</p>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<b>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);">T</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">T next(T x);<br />template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);">T, </span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);"> Distance</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">T next(T x, Distance n);<br />template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);">T</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">T prior(T x);<br />template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);">T, </span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);"> Distance</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
						</font>
				</b>
				<span style="color: rgb(0, 0, 0);">
						<font size="3">
								<b>T prior(T x, Distance n);</b>
								<br />
						</font>
				</span>
		</div>
		<b>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</b>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">函数模板对传入的指针，智能指针或是迭代器做递增或递减，并传回它。用法如下：</span>
				<b>
						<span lang="EN-US">
						</span>
				</b>
		</p>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<font size="3">
						<span style="color: rgb(0, 0, 255);">const</span>
						<span style="color: rgb(0, 0, 0);"> std::list</span>
						<span style="color: rgb(0, 0, 0);">&lt;</span>
						<span style="color: rgb(0, 0, 0);">T</span>
						<span style="color: rgb(0, 0, 0);">&gt;</span>
						<span style="color: rgb(0, 0, 0);">::iterator p </span>
						<span style="color: rgb(0, 0, 0);">=</span>
				</font>
				<font size="3">
						<span style="color: rgb(0, 0, 0);"> get_some_iterator();<br /></span>
						<span style="color: rgb(0, 0, 255);">const</span>
						<span style="color: rgb(0, 0, 0);"> std::list</span>
						<span style="color: rgb(0, 0, 0);">&lt;</span>
						<span style="color: rgb(0, 0, 0);">T</span>
						<span style="color: rgb(0, 0, 0);">&gt;</span>
						<span style="color: rgb(0, 0, 0);">::iterator prev </span>
						<span style="color: rgb(0, 0, 0);">=</span>
				</font>
				<font size="3">
						<span style="color: rgb(0, 0, 0);"> boost::prior(p);<br /></span>
						<span style="color: rgb(0, 0, 255);">const</span>
						<span style="color: rgb(0, 0, 0);"> std::list</span>
						<span style="color: rgb(0, 0, 0);">&lt;</span>
						<span style="color: rgb(0, 0, 0);">T</span>
						<span style="color: rgb(0, 0, 0);">&gt;</span>
						<span style="color: rgb(0, 0, 0);">::iterator next </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> boost::next(prev, </span>
						<span style="color: rgb(0, 0, 0);">2</span>
						<span style="color: rgb(0, 0, 0);">);</span>
				</font>
		</div>
		<p>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">事实上，</span>
				<b>
						<span lang="EN-US">T next(T x)</span>
				</b>
				<b>
						<span style="font-family: 宋体;">和</span>
						<span lang="EN-US">T prior(T x)</span>
				</b>
				<span style="font-family: 宋体;">将分别调用</span>
				<b>
						<span lang="EN-US">operator++</span>
				</b>
				<b>
						<span style="font-family: 宋体;">和</span>
						<span lang="EN-US">operator--</span>
				</b>
				<span style="font-family: 宋体;">，而</span>
				<b>
						<span lang="EN-US">T next(T x, Distance n)</span>
				</b>
				<span style="font-family: 宋体;">和</span>
				<b>
						<span lang="EN-US">T prior(T x, Distance n)</span>
				</b>
				<span style="font-family: 宋体;">则调用</span>
				<b>
						<span lang="EN-US">std::distance(T x, size_t n) </span>
				</b>
				<span lang="EN-US">。 </span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">4.<b>noncopyable</b></span>
				<span style="font-family: 宋体;">类</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">如果你需要设计一个不可以被复制的类，那么你就要明确地将它的拷贝构造函数和</span>
				<span lang="EN-US">operator = ()</span>
				<span style="font-family: 宋体;">放到</span>
				<span lang="EN-US">private</span>
				<span style="font-family: 宋体;">声明下面。</span>
				<span lang="EN-US">Boos\utility</span>
				<span style="font-family: 宋体;">准备了一个基类</span>
				<span lang="EN-US">noncopyable</span>
				<span style="font-family: 宋体;">，你只需要让你的类继承自</span>
				<span lang="EN-US">noncopyable</span>
				<span style="font-family: 宋体;">就可以获得这个性质。对你的类来说这也是一个显式的声明：“我是不可以被复制的！”</span>
				<br />
				<span style="font-family: 宋体;">用法：</span>
		</p>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<b>
						<font size="3">
								<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);">utility.hpp</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
						</font>
						<span style="color: rgb(0, 0, 0);">
								<br />
								<br />
						</span>
						<font size="3">
								<span style="color: rgb(0, 0, 255);">class</span>
						</font>
				</b>
				<font size="3">
						<span style="color: rgb(0, 0, 0);">
								<b> ResourceLadenFileSystem : boost::noncopyable {<br /><img src="http://www.cppblog.com/images/dot.gif" /></b>
						</span>
						<br />
				</font>
		</div>
		<br />
		<p class="MsoNormal">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">5</span>
				<span style="font-family: 宋体;">．函数模板</span>
				<b>
						<span lang="EN-US">addressof()<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">函数模板返回一个对象的真实地址（当然这是交给指针了）：</span>
		</p>
		<b>
				<span lang="EN-US">
				</span>
		</b>
		<b>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</b>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">
				</span>
		</p>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<b>
						<font size="3">
								<span style="color: rgb(0, 0, 0);">template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 0);">typename T</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">inline T</span>
								<span style="color: rgb(0, 0, 0);">*</span>
								<span style="color: rgb(0, 0, 0);">                addressof(T</span>
								<span style="color: rgb(0, 0, 0);">&amp;</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);"> v);<br />template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 0);">typename T</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">inline </span>
								<span style="color: rgb(0, 0, 255);">const</span>
								<span style="color: rgb(0, 0, 0);"> T</span>
								<span style="color: rgb(0, 0, 0);">*</span>
								<span style="color: rgb(0, 0, 0);">         addressof(</span>
								<span style="color: rgb(0, 0, 255);">const</span>
								<span style="color: rgb(0, 0, 0);"> T</span>
								<span style="color: rgb(0, 0, 0);">&amp;</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);"> v);<br />template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 0);">typename T</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">inline </span>
								<span style="color: rgb(0, 0, 255);">volatile</span>
								<span style="color: rgb(0, 0, 0);"> T</span>
								<span style="color: rgb(0, 0, 0);">*</span>
								<span style="color: rgb(0, 0, 0);">      addressof(</span>
								<span style="color: rgb(0, 0, 255);">volatile</span>
								<span style="color: rgb(0, 0, 0);"> T</span>
								<span style="color: rgb(0, 0, 0);">&amp;</span>
						</font>
						<font size="3">
								<span style="color: rgb(0, 0, 0);"> v);<br />template </span>
								<span style="color: rgb(0, 0, 0);">&lt;</span>
								<span style="color: rgb(0, 0, 0);">typename T</span>
								<span style="color: rgb(0, 0, 0);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">inline </span>
								<span style="color: rgb(0, 0, 255);">const</span>
								<span style="color: rgb(0, 0, 0);">
								</span>
								<span style="color: rgb(0, 0, 255);">volatile</span>
								<span style="color: rgb(0, 0, 0);">T</span>
								<span style="color: rgb(0, 0, 0);">*</span>
								<span style="color: rgb(0, 0, 0);"> addressof(</span>
								<span style="color: rgb(0, 0, 255);">const</span>
								<span style="color: rgb(0, 0, 0);">
								</span>
								<span style="color: rgb(0, 0, 255);">volatile</span>
								<span style="color: rgb(0, 0, 0);">T</span>
								<span style="color: rgb(0, 0, 0);">
								</span>
								<span style="color: rgb(0, 0, 0);">&amp; v);</span>
						</font>
				</b>
		</div>
		<br />我知道你想说，为什么不是简单的调用<b><span lang="EN-US">operator&amp;()</span></b><span style="font-family: 宋体;">。因为</span><span lang="EN-US">c++</span><span style="font-family: 宋体;">允许重载</span><b><span lang="EN-US">operator&amp;()</span></b><span style="font-family: 宋体;">，所以有时使用它获得的并不是对象的真实地址，而是编写重载</span><b><span lang="EN-US">operator&amp;()</span></b><span style="font-family: 宋体;">代码的作者希望给你的那个。如果你却是希望获得的是这个对象的地址，使用</span><b><span lang="EN-US">addressof():<o:p></o:p></span></b><p></p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><b><font size="3"><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);">utility.hpp</span><span style="color: rgb(0, 0, 0);">&gt;</span></font><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);"><font size="3">struct</font></span><font size="3"><span style="color: rgb(0, 0, 0);"> useless_type {};<br /><br /></span><span style="color: rgb(0, 0, 255);">class</span></font><font size="3"><span style="color: rgb(0, 0, 0);"> nonaddressable {<br />  useless_type </span><span style="color: rgb(0, 0, 255);">operator</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">() </span><span style="color: rgb(0, 0, 255);">const</span></font><font size="3"><span style="color: rgb(0, 0, 0);">;<br />};<br /><br /></span><span style="color: rgb(0, 0, 255);">void</span></font><font size="3"><span style="color: rgb(0, 0, 0);"> f() {<br />  nonaddressable x;<br />  nonaddressable</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> xp </span><span style="color: rgb(0, 0, 0);">=</span></font><font size="3"><span style="color: rgb(0, 0, 0);"> boost::addressof(x);<br />  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> nonaddressable* xpe = &amp;x; </span><span style="color: rgb(0, 128, 0);">//</span></font><font size="3"><span style="color: rgb(0, 128, 0);">error! operator&amp;()已经被重载，<br />                              </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">它返回的是useless_type的指针</span><br />}<span style="color: rgb(0, 128, 0);"></span></font></b><br /></div><br /><br /><br />上述的所有东西都可以简单的通过在你的源文件开头处写上：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><b><font size="3"><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\utility.hpp</span><span style="color: rgb(0, 0, 0);">&gt;</span></font><span style="color: rgb(0, 0, 0);"><br /></span><font size="3"><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> boost;</span></font></b></div>就可以使用了。当然我是指你机器上已经有boost这个奇妙的库，并且正确配置^_^<img src ="http://www.cppblog.com/nj-blog/aggbug/11264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nj-blog/" target="_blank">小山日志</a> 2006-08-16 00:24 <a href="http://www.cppblog.com/nj-blog/archive/2006/08/16/11264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost/utility里有什么东西？(1)</title><link>http://www.cppblog.com/nj-blog/archive/2006/08/11/11144.html</link><dc:creator>小山日志</dc:creator><author>小山日志</author><pubDate>Fri, 11 Aug 2006 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/nj-blog/archive/2006/08/11/11144.html</guid><wfw:comment>http://www.cppblog.com/nj-blog/comments/11144.html</wfw:comment><comments>http://www.cppblog.com/nj-blog/archive/2006/08/11/11144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/nj-blog/comments/commentRss/11144.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/nj-blog/services/trackbacks/11144.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">STL</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">utility</span>
				<span style="FONT-FAMILY: 宋体">一样，</span>
				<span lang="EN-US">boost/utility</span>
				<span style="FONT-FAMILY: 宋体">里包含了一些实用的小工具。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<?xml:namespace prefix = o /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">首先是</span>
				<span lang="EN-US">
						<span>  </span>Base-from-Member</span>
				<span style="FONT-FAMILY: 宋体">：</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">有时你可能需要依赖成员变量来初始化基类，像这样：</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,255)">class</span>
				<span style="COLOR: rgb(0,0,0)"> fdoutbuf<br />    : </span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)"> std::streambuf<br />{<br /></span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)">:<br />    </span>
				<span style="COLOR: rgb(0,0,255)">explicit</span>
				<span style="COLOR: rgb(0,0,0)"> fdoutbuf( </span>
				<span style="COLOR: rgb(0,0,255)">int</span>
				<span style="COLOR: rgb(0,0,0)"> fd );<br />    </span>
				<span style="COLOR: rgb(0,128,0)">//</span>
				<span style="COLOR: rgb(0,128,0)">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span style="COLOR: rgb(0,128,0)">
				</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />};<br /><br /></span>
				<span style="COLOR: rgb(0,0,255)">class</span>
				<span style="COLOR: rgb(0,0,0)"> fdostream<br />    : </span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)"> std::ostream<br />{<br /></span>
				<span style="COLOR: rgb(0,0,255)">protected</span>
				<span style="COLOR: rgb(0,0,0)">:<br />    fdoutbuf buf;<br /></span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)">:<br />    </span>
				<span style="COLOR: rgb(0,0,255)">explicit</span>
				<span style="COLOR: rgb(0,0,0)"> fdostream( </span>
				<span style="COLOR: rgb(0,0,255)">int</span>
				<span style="COLOR: rgb(0,0,0)"> fd )<br />        : buf( fd ), std::ostream( </span>
				<span style="COLOR: rgb(0,0,0)">&amp;</span>
				<span style="COLOR: rgb(0,0,0)">buf )<br />        {}<br />    </span>
				<span style="COLOR: rgb(0,128,0)">//</span>
				<span style="COLOR: rgb(0,128,0)">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span style="COLOR: rgb(0,128,0)">
				</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />};<br /><br /></span>
		</div>
		<br />
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">但是，这里</span>
				<span lang="EN-US">fdostream</span>
				<span style="FONT-FAMILY: 宋体">的构造函数的初始化是错误的，因为</span>
				<span lang="EN-US">c++</span>
				<span style="FONT-FAMILY: 宋体">语法要求基类的初始化要先于成员变量的初始化。</span>
				<span lang="EN-US">Base-from-Member</span>
				<span style="FONT-FAMILY: 宋体">提供的解决之道如下：</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,255)">class</span>
				<span style="COLOR: rgb(0,0,0)"> fdoutbuf<br />    : </span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)"> std::streambuf<br />{<br /></span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)">:<br />    </span>
				<span style="COLOR: rgb(0,0,255)">explicit</span>
				<span style="COLOR: rgb(0,0,0)"> fdoutbuf( </span>
				<span style="COLOR: rgb(0,0,255)">int</span>
				<span style="COLOR: rgb(0,0,0)"> fd );<br />    </span>
				<span style="COLOR: rgb(0,128,0)">//</span>
				<span style="COLOR: rgb(0,128,0)">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span style="COLOR: rgb(0,128,0)">
				</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />};<br /><br /></span>
				<span style="COLOR: rgb(0,0,255)">class</span>
				<span style="COLOR: rgb(0,0,0)"> fdostream<br />    : </span>
				<span style="COLOR: rgb(0,0,255)">private</span>
				<span style="COLOR: rgb(0,0,0)"> boost::base_from_member</span>
				<span style="COLOR: rgb(0,0,0)">&lt;</span>
				<span style="COLOR: rgb(0,0,0)">fdoutbuf</span>
				<span style="COLOR: rgb(0,0,0)">&gt;</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />    , </span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)"> std::ostream<br />{<br />    </span>
				<span style="COLOR: rgb(0,128,0)">//</span>
				<span style="COLOR: rgb(0,128,0)"> Helper typedef's</span>
				<span style="COLOR: rgb(0,128,0)">
				</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />    typedef boost::base_from_member</span>
				<span style="COLOR: rgb(0,0,0)">&lt;</span>
				<span style="COLOR: rgb(0,0,0)">fdoutbuf</span>
				<span style="COLOR: rgb(0,0,0)">&gt;</span>
				<span style="COLOR: rgb(0,0,0)">  pbase_type;<br />    typedef std::ostream                        base_type;<br /></span>
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)">:<br />    </span>
				<span style="COLOR: rgb(0,0,255)">explicit</span>
				<span style="COLOR: rgb(0,0,0)"> fdostream( </span>
				<span style="COLOR: rgb(0,0,255)">int</span>
				<span style="COLOR: rgb(0,0,0)"> fd )<br />        : pbase_type( fd ), base_type( </span>
				<span style="COLOR: rgb(0,0,0)">&amp;</span>
				<span style="COLOR: rgb(0,0,0)">member )<br />        {}<br />    </span>
				<span style="COLOR: rgb(0,128,0)">//</span>
				<span style="COLOR: rgb(0,128,0)">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span style="COLOR: rgb(0,128,0)">
				</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />};</span>
		</div>
		<span style="FONT-FAMILY: 宋体">
				<br />模板类</span>
		<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">template &lt; typename MemberType, int UniqueID = 0 &gt; <br />        class boost::base_from_member;</span>
		<span lang="EN-US">
				<o:p>
				</o:p>
		</span>
		<span style="FONT-FAMILY: 宋体">是一个外覆类（姑且这么叫了</span>
		<span lang="EN-US">^_^</span>
		<span style="FONT-FAMILY: 宋体">）。<br />如上，私有继承</span>
		<span lang="EN-US">base_from_member</span>
		<span style="FONT-FAMILY: 宋体">，原先的成员变量将做为</span>
		<span lang="EN-US">base_from_member</span>
		<span style="FONT-FAMILY: 宋体">的成员变量</span>
		<span lang="EN-US">member</span>
		<span style="FONT-FAMILY: 宋体">先于基类</span>
		<span lang="EN-US">base_type</span>
		<span style="FONT-FAMILY: 宋体">初始化，这样所需的依赖关系可以满足。事实上比这更好的是，</span>
		<span lang="EN-US">base_from_member</span>
		<span style="FONT-FAMILY: 宋体">的构造函数是模板函数，它可以有</span>
		<span lang="EN-US">0</span>
		<span style="FONT-FAMILY: 宋体">至</span>
		<span lang="EN-US">10</span>
		<span style="FONT-FAMILY: 宋体">个参数，参数类型可以各不相同。</span>
<img src ="http://www.cppblog.com/nj-blog/aggbug/11144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nj-blog/" target="_blank">小山日志</a> 2006-08-11 23:59 <a href="http://www.cppblog.com/nj-blog/archive/2006/08/11/11144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>