﻿<?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++博客-选择C/C++-随笔分类-STL、Boost、范型编程</title><link>http://www.cppblog.com/walkspeed/category/3644.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 15:21:52 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 15:21:52 GMT</pubDate><ttl>60</ttl><item><title>boost正则表达式库简单介绍</title><link>http://www.cppblog.com/walkspeed/archive/2007/12/28/39823.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Fri, 28 Dec 2007 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/12/28/39823.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/39823.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/12/28/39823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/39823.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/39823.html</trackback:ping><description><![CDATA[头文件 regex.hpp<br><br>常用的类<br>boost::regex 正则表达式<br><br>boost::cmatch 以char数组为容器，存储匹配返回值。<br>boost::smatch 以std::string为容器，存储匹配返回值。<br><br>boost::regex_match 匹配算法<br>boost::regex_search 查找算法<br>boost::regex_replace 替换算法<br><br>简单例子<br><br>#include &lt;iostream&gt;<br><br>#include &lt;boost/regex.hpp&gt;<br><br>int main( int argc, char* argv[] )<br>{<br>&nbsp;&nbsp; &nbsp;char *buf = "This is boost::regex example";<br><br>&nbsp;&nbsp; &nbsp;boost::regex exampleregex( "boost::regex" );<br>&nbsp;&nbsp; &nbsp;boost::cmatch result;<br><br>&nbsp;&nbsp; &nbsp;if( boost::regex_search( buf, result, exampleregex ) )<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;std::cout &lt;&lt; result.str() &lt;&lt; std::endl;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;return 0;<br>}<br><br>注意regex.hpp的包含。要在开发工具中设置boost头文件所在位子。<br><br>
<br><img src ="http://www.cppblog.com/walkspeed/aggbug/39823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-12-28 14:01 <a href="http://www.cppblog.com/walkspeed/archive/2007/12/28/39823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost.Bind的基础使用</title><link>http://www.cppblog.com/walkspeed/archive/2007/07/20/28448.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Fri, 20 Jul 2007 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/07/20/28448.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/28448.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/07/20/28448.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/28448.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/28448.html</trackback:ping><description><![CDATA[当我们使用函数时习惯于C函数的格式,即如下形式<br>resulttype funname( arglist );<br>返回值类型 函数名( 参数列表 );<br><br>在Boost.Function中，我们可以方便的定义定义函数对象。不过在定义用来表示类成员函数的函数对象时<br>第一个参数是类指针。而且在调用时，要传入一个类实例的指针。这样用起来并不是很方便，因为调用者<br>要知道类实例。这实际上没有实现解耦。而解耦是我们使用回调或委托设计的一个目标。<br><br>为了解决这个问题，我们要使用Boost.Bind库<br><br>Boost.Bind是一个函数对象工厂。他用来产生我们需要的函数对象。好了，有了它，你可以在你设计中大<br>量使用Boost.Function。不用再去定义类成员函数形式的函数对象啦，只用定义普通函数对象。<br><br>一个简单的例子<br><br>class CExample<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; bool printstr( const std::string &amp;str )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "CExample::printstr" &lt;&lt; str &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; }<br>};<br><br>//定义一个函数对象<br>boost::function&lt; bool ( const std::string&amp; ) &gt; printstr;<br><br>//用Boost.Bind创建一个函数对象，赋给printstr<br>CExample example;<br>printstr = boost::bind( &amp;CExample::printstr, &amp;example, _1 );<br><br>好了，我们创建了一个函数对象，而且调用时不再需要类实例拉。用Boost.Function和Boost.Bind大大<br>的简化了Command模式的实现。<br><br>在上面的例子中要个古怪的对象"_1"。这个叫做站位符，他代表这个位置有个参数，但现在还不知道参<br>数是什么。_1代表参数列表中的第一个位置上的参数。Boost.Bind一共定义了9个站位符对象。如下<br>_1,_2,_3,_4,_5,_6,_7,_8,_9。分别代表参数列表中位子。<br><br>Boost.Bind产生的函数对象可以直接使用，利用上面的例子。<br><br>bool b = boost::bind( &amp;CExample::printstr, &amp;example, _1 )( "Hello World" );<br><br><br> <img src ="http://www.cppblog.com/walkspeed/aggbug/28448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-07-20 17:15 <a href="http://www.cppblog.com/walkspeed/archive/2007/07/20/28448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost.Function的基本使用</title><link>http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 18 Jul 2007 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/28272.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/28272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/28272.html</trackback:ping><description><![CDATA[Boost.Function库用来提供一个对象化的函数指针。<br><br>函数指针对设计很有用。它使调用者可以延期调用，调用时机由调用者确定。而且可以改变<br>响应者，以应对不同的要求。<br><br>C中的函数指针只能用于自由函数。在C++中除了自由函数还有函数对象和类成员函数，这些<br>C的函数指针是无法用的。这要求能适应C++语言的函数指针。既然C++语言本身没有提供，<br>那就提供一个库。stl提供了，但是定义了很多类型，使用起来并不是很方便，而且函数参数<br>的个数被限定在两个以下，更能是备受限制。Boost.Function库提供了一个好的解决方案。<br><br>Boost.Function库可以支持自由函数，函数对象，类成员函数。而且参数个数多达10个。<br>Boost.Function库利用模板技术来实现。生成的代码有很高的运行效率。本库可以不用编译<br>直接使用。<br><br>Boost.Function的头文件。<br>function.hpp<br><br>定义一个Boost.Function的对象（是一个返回值类型为int，第一个参数是std::string类型<br>第二个参数是float类新）<br><br>boost::function&lt; int ( std::string, float ) &gt; funptr;<br><br>上面这个定义方式是一种容易理解的定义方式。但有些编译器不支持，如果想更多的编译器<br>支持，则用下面这种定义方式<br><br>boost::function2&lt; int, std::string, float &gt; funptr;<br><br>注意模板中有3个类型，而function类却是boost::function2。应为返回值类型不计算在参数<br>类型中（原因很简单，C++的编译器不会根据返回类型不同来区分函数定义的不同）。<br><br>int freefun( std::string str, float f )<br>{<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; str &lt;&lt; " : " &lt;&lt; f &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>class CFun<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; int operator() ( std::string str, float f )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; str &lt;&lt; " : " &lt;&lt; f &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>上面定义了一个自由函数和一个函数对象。下面将把他们付给function对象。<br><br>赋值为自由函数<br>funptr = &amp;freefun;<br><br>赋值为函数对象<br>CFun fun;<br>funptr = fun;<br><br>以上两种情况的调用方法一致，如下<br>funptr( "float =", 10.0 );<br><br>Boost.Function对象要能指向类型原函数，其定义要如下<br><br>class FreeClass<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; int out( std::string str, float f )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; str &lt;&lt; " : " &lt;&lt; f &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>};<br><br>boost::function&lt; int ( FreeClass*, std::string, float ) &gt; funptr;<br><br>跨平台的定义方法<br>boost::function3&lt; int, FreeClass*, std::string, float &gt; funptr;<br><br>赋值方法<br>funptr = &amp;FreeClass::out;<br><br>调用方法<br>FreeClass fc;<br><br>funptr( &amp;fc, "float =", 10.0 );<br><br><br> <img src ="http://www.cppblog.com/walkspeed/aggbug/28272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-07-18 13:28 <a href="http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Signal中用来管理slot的管理器</title><link>http://www.cppblog.com/walkspeed/archive/2007/04/25/22803.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 25 Apr 2007 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/04/25/22803.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/22803.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/04/25/22803.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/22803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/22803.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>Signal</span><span>会安优先级的不同来调用不同组的</span><span>slot</span><span>。这样要求</span><span>signal</span><span>能根据不同的优先级来管理</span><span>slot</span><span>组。典型的实现方法是用</span><span>std::map</span><span>。将其定义为如下形式</span><span>std::map&lt; int, slot &gt;</span><span>。由于每个优先级下可能有一组</span><span>slot</span><span>，所以要将这一组</span><span>slot</span><span>组织到一起管理，在</span><span>boost signal</span><span>中使用</span><span>std::list</span><span>来管理，其可能的形式大体如下</span><span>std::list&lt; slot &gt;</span><span>。这样就要修改刚才定义的</span><span>map</span><span>了，修改后的</span><span>map</span><span>可能的定义如下</span><span>std::map&lt; int, std::list&lt; slot &gt; &gt;</span><span>。</span>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在实际的</span><span>boost signal</span><span>中并没有直接的存储</span><span>slot</span><span>（</span><span>boost signal</span><span>库中有个</span><span>slot</span><span>类），而是存储了</span><span>function</span><span>（</span><span>boost function</span><span>类的对象）对象。而且为了方便控制</span><span>signal</span><span>与</span><span>function</span><span>之间的联系，引入了</span><span>connection</span><span>类，用来表示</span><span>signal</span><span>与</span><span>function</span><span>之间的联系。</span><span>Connection</span><span>的对象当然和一个</span><span>function</span><span>放在了一起。这样</span><span>boost signal</span><span>提供了一个</span><span>connection_slot_pair</span><span>类来存储一个</span><span>function</span><span>与</span><span>connection</span><span>对。这样在</span><span>boost signal</span><span>中一个</span><span>slot</span><span>组的实际定义如下</span><span>std::list&lt; connection_slot_pair &gt;</span><span>。并且被重定义为</span><span>group_list</span><span>类型（</span><span>typedef std::list&lt;connection_slot_pair&gt; group_list</span><span>）。相应的在</span><span>boost signal</span><span>中</span><span>map</span><span>的实际定义如下</span><span>std::map&lt;stored_group, group_list, compare_type&gt;</span><span>，并且被重定义为</span><span>slot_container_type</span><span>（</span><span>typedef std::map&lt;stored_group, group_list, compare_type&gt; slot_container_type</span><span>）。将以上的这些东西组织到一个类中，以便于管理。这个类就是</span><span>named_slot_map</span><span>。</span><span>Signal</span><span>中真正用来管理</span><span>slot</span><span>的管理器。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Named_slot_map</span><span>的类数据成员如下定义（</span><span>boost</span><span>源码中的一部分，数据成员部分）</span></p>
<p>&nbsp;</p>
<p align=left><span>class BOOST_SIGNALS_DECL named_slot_map</span></p>
<p align=left><span>{</span></p>
<p align=left><span>public:</span></p>
<p align=left><span>typedef named_slot_map_iterator iterator;//named_slot_map</span><span>容器的迭代器</span></p>
<p align=left><span>private:</span></p>
<p align=left><span>typedef std::list&lt;connection_slot_pair&gt; group_list;//function connection</span><span>对组类型</span></p>
<p align=left><span>typedef std::map&lt;stored_group, group_list, compare_type&gt; slot_container_type;//</span><span>容器类型</span></p>
<p align=left><span>typedef slot_container_type::iterator group_iterator;//</span><span>容器迭代器类型</span></p>
<p align=left><span>typedef slot_container_type::const_iterator const_group_iterator;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>slot_container_type groups;//</span><span>定义一个用来管理</span><span>function connection</span><span>组的容器对象</span></p>
<p align=left><span>group_iterator back;//</span><span>容器的迭代器对象</span></p>
<p align=left><span>};</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Named_slot_map</span><span>也是一个容器。</span><span>Stl</span><span>的容器为了外界方便访问容器内数据单元，提供了迭代器。</span><span>Named_slot_map</span><span>也有自己的迭代器。这个迭代器就是</span><span>named_slot_map_iterator</span><span>类。</span><span>Named_slot_map</span><span>提供了以下方法来获得迭代器</span><span>iterator begin()</span><span>，</span><span>iterator end()</span><span>。</span><span>Begin</span><span>方法提供首迭代器，</span><span>end</span><span>方法提供尾迭代器。向容器中插入数据用</span><span>insert</span><span>。清除某个数据用而而然</span><span>erase</span><span>，清空容器中的所有数据用</span><span>clear</span><span>。</span></p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/22803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-25 15:18 <a href="http://www.cppblog.com/walkspeed/archive/2007/04/25/22803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由signal的一些东西联想到了AM</title><link>http://www.cppblog.com/walkspeed/archive/2007/04/24/22756.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Tue, 24 Apr 2007 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/04/24/22756.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/22756.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/04/24/22756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/22756.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/22756.html</trackback:ping><description><![CDATA[　　敏捷开发中提倡依赖关系倒置，即１依赖接口而非具体类，２使用接口的对象定义接口。<br>　　boost signal中的signal的模板参数是个函数类型。可以将其看成一个接口。signal对象依赖这个接口，而且是有signal定义的。具体类去实现镇魂歌接口（即实现这个函数类型）<br>　　signal和slot框架组成了一个observer模式的实现。signal是出版者，slot是订阅者
<img src ="http://www.cppblog.com/walkspeed/aggbug/22756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-24 19:36 <a href="http://www.cppblog.com/walkspeed/archive/2007/04/24/22756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奇怪于signal中的slot类的用途</title><link>http://www.cppblog.com/walkspeed/archive/2007/04/23/22654.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Mon, 23 Apr 2007 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/04/23/22654.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/22654.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/04/23/22654.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/22654.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/22654.html</trackback:ping><description><![CDATA[<p>　　本以为slot就是被signal存储并管理的slot。但是通过解读boost的源代码发现这个类并没有被signal直接管理，而仅仅用来构造了下connection。没有发现其他的用途。如果这样，那为何不直接在signal的connect中直接进行connection的构造呢。<br>　　signal的connect函数没有直接接收function对象，而是接收的slot&lt;&gt;对象，而slot&lt;&gt;对象用来接收function。这个function看来未必一定是个函数对象了。可以是个原始函数或类函数了。 这个猜测要证实了才能确定。即便如此，这个类的作用是有限的。不过关于那个tackeable的用法还没有完全高清楚，可能那是这个类存在的理由，也许以后会有什么的发展。但现在确实看不出什么大的用途。<br>　　奇怪于为何在signal中的slot管理器，不去直接管理slot&lt;&gt;的实例，而是管理connection和function的pair。</p>
<p>　　个人觉得在slot&lt;&gt;中的最有用处的函数。<br>void slot_base::create_connection()<br>{<br>&nbsp;basic_connection* con = new basic_connection();</p>
<p>&nbsp;{<br>&nbsp;&nbsp;con-&gt;signal = static_cast&lt;void*&gt;(this);<br>&nbsp;&nbsp;con-&gt;signal_data = 0;<br>&nbsp;&nbsp;con-&gt;blocked_ = false ;<br>&nbsp;&nbsp;con-&gt;signal_disconnect = &amp;bound_object_destructed;<br>&nbsp;}<br>&nbsp;<br>&nbsp;data-&gt;watch_bound_objects.reset(con);</p>
<p>&nbsp;scoped_connection safe_connection(data-&gt;watch_bound_objects);</p>
<p>&nbsp;for(std::vector&lt;const trackable*&gt;::iterator i = data-&gt;bound_objects.begin();<br>&nbsp;&nbsp;i != data-&gt;bound_objects.end(); ++i) <br>&nbsp;{<br>&nbsp;&nbsp;BOOST_SIGNALS_NAMESPACE::detail::bound_object binding;<br>&nbsp;&nbsp;(*i)-&gt;signal_connected(data-&gt;watch_bound_objects, binding);</p>
<p>&nbsp;&nbsp;BOOST_SIGNALS_NAMESPACE::detail::auto_disconnect_bound_object disconnector(binding);</p>
<p>&nbsp;&nbsp;con-&gt;bound_objects.push_back(binding);<br>&nbsp;&nbsp;disconnector.release();<br>&nbsp;}</p>
<p>&nbsp;safe_connection.release();<br>&nbsp;data-&gt;watch_bound_objects.set_controlling(true);<br>}</p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/22654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-23 16:57 <a href="http://www.cppblog.com/walkspeed/archive/2007/04/23/22654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Metafunction 原操作</title><link>http://www.cppblog.com/walkspeed/archive/2007/04/07/21454.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 07 Apr 2007 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/04/07/21454.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/21454.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/04/07/21454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/21454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/21454.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是我在看boost MPL时试着翻译的东西，现在贴上来。<br><br>A metafunction is a class or a class template that represents a function invocable at compile-time. <br>一个原操作是在编译器表现了调用操作的一个类或一个模板类。</p>
<p>An non-nullary metafunction is invoked by instantiating the class template with particular template parameters (metafunction arguments); <br>一个非无参的原操作被一个有详细模板参数的模板类请求；<br>the result of the metafunction application is accessible through the instantiation's nested type typedef. <br>原操作应用的返回值是一个通过模板类实例可取的内嵌的类型定义。</p>
<p>All metafunction's arguments must be types (i.e. only type template parameters are allowed). <br>所有的原操作的参数必须是类型。</p>
<p>A metafunction can have a variable number of parameters. <br>一个原操作能有一个数量变化的参数</p>
<p>A nullary metafunction is represented as a (template) class with a nested type typename member.<br>一个无参数原操作被表现为有内嵌重命名类型的类</p>
<p>原操作的三种表达式（f是一个原操作）<br>1 f::type<br>2 f&lt;&gt;::type<br>3 f&lt; a1,..,an &gt;::type</p>
<p><br>Lambda Expression 构造和分配表达式</p>
<p>A Lambda Expression is a compile-time invocable entity in either of the following two forms:<br>一个构造和分配表达式是下面两个中的一个编译期调用单元</p>
<p>Metafunction Class<br>原操作类</p>
<p>Placeholder Expression <br>站位符表达式</p>
<p>Most of the MPL components accept either of those, and the concept gives us a consice way to describe these requirements.<br>大部分的MPL组件接收它们其中一个，</p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/21454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-07 16:20 <a href="http://www.cppblog.com/walkspeed/archive/2007/04/07/21454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用vector来自动生成类</title><link>http://www.cppblog.com/walkspeed/archive/2007/04/07/21453.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 07 Apr 2007 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/04/07/21453.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/21453.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/04/07/21453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/21453.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/21453.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Modern C++ Design中实现了一个自动生成类的方法。它用的是Loki中的TypeList。我在这里使用了boost MPL中的vector来作为类型的容器。按boost MPL库的设计理念，其他的类型容器也应该可以利用这里的实现的（没有试过，可能有问题，特别是map类型容器）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现如下（注：我已将boost的头文件放到了vc的include目录中）<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; #include &lt; boost/mpl/vector.hpp &gt;<br>&nbsp;&nbsp;&nbsp; #include &lt; boost/mpl/front.hpp &gt;<br>&nbsp;&nbsp;&nbsp; #include &lt; boost/mpl/pop_front.hpp &gt;</p>
<p>&nbsp;&nbsp;&nbsp; template&lt; typename Type &gt;<br>&nbsp;&nbsp;&nbsp; struct Holder<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type value_;<br>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp; template&lt; typename TypeSequeue, template&lt; typename &gt; class Unit &gt;<br>&nbsp;&nbsp;&nbsp; struct TypeConstract : public Unit&lt; typename boost::mpl::front&lt; TypeSequeue &gt;::type &gt;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public TypeConstract&lt; typename boost::mpl::pop_front&lt; TypeSequeue &gt;::type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unit &gt;<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp; template&lt; template&lt; typename &gt; class Unit &gt;<br>&nbsp;&nbsp;&nbsp; struct TypeConstract&lt; boost::mpl::vector&lt;&gt;::type, Unit &gt;<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; };&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/21453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-07 16:02 <a href="http://www.cppblog.com/walkspeed/archive/2007/04/07/21453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost库中mpl中的Data_Types</title><link>http://www.cppblog.com/walkspeed/archive/2007/03/10/19538.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 10 Mar 2007 06:10:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/03/10/19538.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/19538.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/03/10/19538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/19538.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/19538.html</trackback:ping><description><![CDATA[
		<p align="left">    boost库中MPL部分提供了Data_Types。其中提供了对数字类型的一个wrapper<br />    有一下这么几个，都在boost::mpl名字空间下<br />    <br />    bool_ 是一个bool型的常量wrapper，头文件 #include&lt; boost/mpl/bool.hpp &gt;<br />    int_  是一个int型的常量wrapper，头文件 #include&lt; boost/mpl/int.hpp &gt;<br />    long_ 是一个long型的常量wrapper，头文件 #include&lt; boost/mpl/long.hpp &gt;<br />    size_t 是一个std::size_t型的常量wrapper，头文件 #include&lt; boost/mpl/size_t.hpp &gt;<br />    integral_c 提供了对整形的一个通用wrapper，头文件 #include&lt; boost/mpl/integral_c.hpp &gt;<br />    <br />    这些常量提供了如下的能力（假设一个常量类型 n ）<br />    获得常量类型包含的类型 n::value_type<br />    获得常量类型的类型     n::type<br />    获得常量类型的值       n::value<br />    返回常量类型的值       n()<br />    <br />    bool_部分<br />    <br />    bool_的声明如下<br />    <br />    template&lt; bool C &gt;<br />    struct bool_;<br />    <br />    库中定义了两个常用的bool型常量，true_和false_。定义分别如下<br />    typedef bool_&lt; true &gt; true_;<br />    typedef bool_&lt; false &gt; false_;<br />    <br />    bool_特性如下<br />    bool_&lt; true &gt;::value_type == bool<br />    bool_&lt; true &gt;::type == bool&lt; true &gt;<br />    bool_&lt; true &gt;::value == true<br />    bool_&lt; true &gt;() == true<br />    <br />    int_部分<br />    <br />    int_的声明如下<br />    <br />    template&lt; int N &gt;<br />    struct int_;<br />    <br />    int_特性如下<br />    int_&lt; 10 &gt;::value_type == int;<br />    int_&lt; 10 &gt;::type == int_&lt; 10 &gt;;<br />    int_&lt; 10 &gt;::value == 10;<br />    int_&lt; 10 &gt;() == 10;<br />    <br />    long_部分<br />    <br />    long_的声明如下<br />    <br />    template&lt; long N &gt;<br />    struct long_;<br />    <br />    long_特性如下<br />    long_&lt; -500 &gt;::value_type == long;<br />    long_&lt; -500 &gt;::type == long_&lt; -500 &gt;;<br />    long_&lt; -500 &gt;::value == -500;<br />    long_&lt; -500 &gt;() == -500;<br />    <br />    size_t部分<br />    <br />    size_t的声明如下<br />    <br />    template&lt; std::size_t N &gt;<br />    struct size_t;<br />    <br />    size_t的特性如下<br />    size_t&lt; 20 &gt;::value_type == std::size_t;<br />    size_t&lt; 20 &gt;::type == size_t&lt; 20 &gt;;<br />    size_t&lt; 20 &gt;::value == 20;<br />    size_t&lt; 20 &gt;() == 20;<br />    <br />    integral_c部分<br />    <br />    integral_c的声明如下<br />    template&lt; typename T, T N &gt;<br />    struct integral_c;<br />    <br />    integral_c的特性如下<br />    integral_c&lt; short, 8 &gt;::value_type == short;<br />    integral_c&lt; short, 8 &gt;::type == integral_c&lt; short, 8 &gt;;<br />    integral_c&lt; short, 8 &gt;::value == 8;<br />    integral_c&lt; short, 8 &gt;() == 8;</p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/19538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-03-10 14:10 <a href="http://www.cppblog.com/walkspeed/archive/2007/03/10/19538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>