﻿<?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++博客-Hallelujah-随笔分类-C++学习</title><link>http://www.cppblog.com/sh19871122/category/17094.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 29 Apr 2016 15:20:49 GMT</lastBuildDate><pubDate>Fri, 29 Apr 2016 15:20:49 GMT</pubDate><ttl>60</ttl><item><title>有效利用标准库提供的type_traits，让程序在编译时作出分支选择</title><link>http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Thu, 28 Apr 2016 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/213383.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/213383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/213383.html</trackback:ping><description><![CDATA[<div>让程序中的简单if-else在编译期间决定<br /><br />ex.<span style="font-size: 13px; color: #008080;">&nbsp;1</span><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;</span><span style="font-size: 13px; color: #008000;">/*</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;=====================================================================================<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Filename:&nbsp;&nbsp;3.cpp<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Description:&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version:&nbsp;&nbsp;1.0<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Created:&nbsp;&nbsp;03/01/2016&nbsp;11:38:53&nbsp;AM<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Revision:&nbsp;&nbsp;none<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Compiler:&nbsp;&nbsp;gcc<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:&nbsp;&nbsp;shih&nbsp;(Hallelujah),&nbsp;sh19871122@gmail.com<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;Organization:&nbsp;&nbsp;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;=====================================================================================<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #008080; ">20</span>&nbsp;#include&nbsp;&lt;stdint.h&gt;<br /><span style="color: #008080; ">21</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">22</span>&nbsp;#include&nbsp;&lt;type_traits&gt;<br /><span style="color: #008080; ">23</span>&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;is_swapable<br /><span style="color: #008080; ">26</span>&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;value&nbsp;=&nbsp;std::is_integral&lt;T&gt;::value&nbsp;&amp;&amp;&nbsp;<span style="color: #0000FF; ">sizeof</span>(T)&nbsp;&gt;=&nbsp;2;<br /><span style="color: #008080; ">28</span>&nbsp;};<br /><span style="color: #008080; ">29</span>&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">31</span>&nbsp;T&nbsp;byte_swap(T&nbsp;value,&nbsp;std::true_type)<br /><span style="color: #008080; ">32</span>&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*bytes&nbsp;=&nbsp;reinterpret_cast&lt;uint8_t&nbsp;*&gt;(&amp;value);<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(std::size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;<span style="color: #0000FF; ">sizeof</span>(T)/2;&nbsp;++i)<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;v&nbsp;=&nbsp;bytes[i];<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes[i]&nbsp;=&nbsp;bytes[<span style="color: #0000FF; ">sizeof</span>(T)&nbsp;-&nbsp;1&nbsp;-&nbsp;i];&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes[<span style="color: #0000FF; ">sizeof</span>(T)&nbsp;-1&nbsp;-i]&nbsp;=&nbsp;v;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;value;<br /><span style="color: #008080; ">41</span>&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">44</span>&nbsp;T&nbsp;byte_swap(T&nbsp;value,&nbsp;std::false_type)<br /><span style="color: #008080; ">45</span>&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;value;<br /><span style="color: #008080; ">47</span>&nbsp;}<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">50</span>&nbsp;T&nbsp;byte_swap(T&nbsp;value)<br /><span style="color: #008080; ">51</span>&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;byte_swap(value,&nbsp;std::integral_constant&lt;<span style="color: #0000FF; ">bool</span>,&nbsp;is_swapable&lt;T&gt;::value&gt;());<br /><span style="color: #008080; ">53</span>&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br /><span style="color: #008080; ">56</span>&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;0x11223344;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;b&nbsp;=&nbsp;0x4455221112345678;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::hex&nbsp;&lt;&lt;&nbsp;a&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;b&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::hex&nbsp;&lt;&lt;&nbsp;byte_swap(a)&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;byte_swap(b)&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;c&nbsp;=&nbsp;0x11;<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*d&nbsp;=&nbsp;"hello&nbsp;world";<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::hex&nbsp;&lt;&lt;&nbsp;byte_swap(c)&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;byte_swap(d)&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">65</span>&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;</div><img src ="http://www.cppblog.com/sh19871122/aggbug/213383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2016-04-28 17:50 <a href="http://www.cppblog.com/sh19871122/archive/2016/04/28/213383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编译期契约之must_have_base</title><link>http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Tue, 29 Jul 2014 04:25:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/207853.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/207853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/207853.html</trackback:ping><description><![CDATA[在C++中不直接支持约束，用过C#模板的有个where来处理，但是C++中也有些小的技巧来处理。<br />在不完美C++中的must_have_base如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;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 />--><br />template&lt;typename&nbsp;D,&nbsp;typename&nbsp;B&gt;<br /><span style="color: #0000FF; ">struct</span>&nbsp;must_have_base<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;~must_have_base()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*p)(D*,&nbsp;B*)&nbsp;=&nbsp;constraints;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;constraints(D&nbsp;*pd,&nbsp;B&nbsp;*pb)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb&nbsp;=&nbsp;pd;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />原理是通过不执行的成员函数把函数指针在析构函数中赋值，强迫编译器在编译期间检查成员函数内的约束。 &nbsp;</div><br />自己写了个小的实例，虽然这儿有点点牵强，但是，很多情况也需要检查是否是某种类型的子类型的时候还是可以的，<br />完整代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;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;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;template&lt;typename&nbsp;D,&nbsp;typename&nbsp;B&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;must_have_base<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~must_have_base()<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*p)(D*,&nbsp;B*)&nbsp;=&nbsp;constraints;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">private</span>:<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;constraints(D&nbsp;*pd,&nbsp;B&nbsp;*pb)<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb&nbsp;=&nbsp;pd;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;};<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;<span style="color: #0000FF; ">base</span><br /><span style="color: #008080; ">18</span>&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~<span style="color: #0000FF; ">base</span>()&nbsp;{}<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">23</span>&nbsp;};<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;inherit_base:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">base</span><br /><span style="color: #008080; ">26</span>&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;};<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;inherit_not_base&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;};<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;test<br /><span style="color: #008080; ">44</span>&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;testfunc(T&nbsp;&amp;t)<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;must_have_base&lt;T,&nbsp;<span style="color: #0000FF; ">base</span>&gt;();<br /><span style="color: #008080; ">50</span>&nbsp;<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.run();<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;};<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">56</span>&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;t_ok,&nbsp;t_nok;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inherit_base&nbsp;hb;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inherit_not_base&nbsp;hnb;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_ok.testfunc(hb);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_nok.testfunc(hnb);<br /><span style="color: #008080; ">62</span>&nbsp;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">64</span>&nbsp;}</div>抛砖引玉，希望这些东西都能用在实际的工程代码中。<img src ="http://www.cppblog.com/sh19871122/aggbug/207853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-07-29 12:25 <a href="http://www.cppblog.com/sh19871122/archive/2014/07/29/207853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zeromq学习，第一章</title><link>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Sun, 16 Mar 2014 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/206194.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/206194.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/206194.html</trackback:ping><description><![CDATA[Asynchronous Input/Output（AIO）：AIO可以在input/output的请求到来之前继续执行。AIO在实时应用程序中是必须的。使用AIO可以映射多个任务到一个线程上去。<br />首先zeromq的设计是弱中间人的（brokerless，相对于ActiveMQ、RabbitMQ等,使用0zq的程序就可以直接和其他的节点通信而不通过broker的代理。），zeromq不会存储信息到磁盘上，然而可能使用本地的交换文件来存储消息（当设置了zmq.SWAP时）。<br /><br />示例：HelloWorld（server）<br /> <br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_230816" onclick="this.style.display='none'; Code_Closed_Text_230816.style.display='none'; Code_Open_Image_230816.style.display='inline'; Code_Open_Text_230816.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_230816" style="display: none" onclick="this.style.display='none'; Code_Open_Text_230816.style.display='none'; Code_Closed_Image_230816.style.display='inline'; Code_Closed_Text_230816.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_230816" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">server</span><span id="Code_Open_Text_230816" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;zmq.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*context&nbsp;=&nbsp;zmq_ctx_new();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*respond&nbsp;=&nbsp;zmq_socket(context,&nbsp;ZMQ_REQ);<br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_bind(respond,&nbsp;"tcp://*:4040");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("starting<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;request;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init(&amp;request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_recv(&amp;request,&nbsp;respond,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("received:&nbsp;%s\n",&nbsp;zmq_msg_data(&amp;request));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;reply;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init_size(&amp;reply,&nbsp;strlen("world"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(zmq_msg_data(&amp;reply),&nbsp;"world",&nbsp;5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_send(&amp;reply,&nbsp;respond,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;reply);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_close(respond);<br />&nbsp;&nbsp;&nbsp;&nbsp;zmq_ctx_destroy(context);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /></span></div><br />示例：Helloworld（client）<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_230951" onclick="this.style.display='none'; Code_Closed_Text_230951.style.display='none'; Code_Open_Image_230951.style.display='inline'; Code_Open_Text_230951.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_230951" style="display: none" onclick="this.style.display='none'; Code_Open_Text_230951.style.display='none'; Code_Closed_Image_230951.style.display='inline'; Code_Closed_Text_230951.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_230951" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">client</span><span id="Code_Open_Text_230951" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;unistd.h&gt;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;&lt;zmq.h&gt;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*context&nbsp;=&nbsp;zmq_ctx_new();<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("client&nbsp;starting<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*request&nbsp;=&nbsp;zmq_socket(context,&nbsp;ZMQ_REQ);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_connect(request,&nbsp;"tcp://localhost:4040");<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;req;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init_size(&amp;req,&nbsp;strlen("hello"));<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(zmq_msg_data(&amp;req),&nbsp;"hello",&nbsp;5);<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("send&nbsp;msg&nbsp;hello,&nbsp;count&nbsp;=&nbsp;%d\n",&nbsp;count);<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_send(&amp;req,&nbsp;request,&nbsp;0);<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;req);<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_t&nbsp;reply;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_init(&amp;reply);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_recv(&amp;reply,&nbsp;request,&nbsp;0);<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("recv&nbsp;msg&nbsp;%s,&nbsp;count&nbsp;=&nbsp;%d\n",&nbsp;zmq_msg_data(&amp;reply),&nbsp;count);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_msg_close(&amp;reply);<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_close(request);<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmq_ctx_destroy(context);<br /><span style="color: #008080; ">36</span>&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">38</span>&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;</span></div><br />这里使用了最基本的请求应答架构。详细解析代码：<br />第一步：创建了context和socket，zmq_ctx_new方法创建了一个新的<span style="color: red;">context，这是线程安全</span>的，即一个context可用于多个线程操作。 zmq_socket方法创建了一个在context中定义的socket，<span style="color: red;">ZeroMQ的socket不是线程安全</span>。传统的socket是同步的，然而ZMQ的socket在客户端和服务端都维护了一个队列来管理request-reply的异步模式。ZMQ自动的处理连接、重连、断开连接和内容交付。<br />服务端创建了Reply（ZMQ_REP）用来处理接收消息并应答消息。如果客户端和服务端遗失（lost），应答的消息将在没有任何通知的情况下丢掉。<br />客户端创建了一个Request(ZMQ_REQ)来发送消息并接收来自服务的应答。ZMQ_REQ下不会丢弃任何信息，不管是没有没有可用与发送消息的服务或是服务处于忙状态，所有的发送操作zmq_send函数会阻塞，直到一个服务变为可用于发送消息。ZMQ_REQ和ZMQ_REP、ZMQ_ROUTER类型兼容。<br />消息的发送zmq_send函数的第三个参数是flags，是ZMQ_DONTWAIT或ZMQ_SNDMORE。ZMQ_DONTWAIT表明消息是异步的发送。ZMQ_SNDMORE表明消息有多部分，其余的部分已经&#8220;在路上了&#8221;。消息接收函数zmq_msg_recv函数，如服务端，在先前接收的消息是无效的。第三个参数flugs可能是ZMQ_DONTWAIT。<br /><br />先睡觉了<img src ="http://www.cppblog.com/sh19871122/aggbug/206194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2014-03-16 23:41 <a href="http://www.cppblog.com/sh19871122/archive/2014/03/16/206194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于关键字volatile使用</title><link>http://www.cppblog.com/sh19871122/archive/2011/06/17/148847.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Fri, 17 Jun 2011 03:59:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2011/06/17/148847.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/148847.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2011/06/17/148847.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/148847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/148847.html</trackback:ping><description><![CDATA[其实关键字volatile大家的说法都差不多，但是很少有一个简单的程序来观测结果或者说状态<br /><br />OK，上个简单的程序，在这里将很好的说明volatile关键字<span class="Apple-style-span" style="font-size: 13px; "><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; ">stdio.h</span><span style="color: #000000; ">&gt;</span></span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><font class="Apple-style-span" color="#008080"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;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; ">stdio.h</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; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;z&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">z)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">z)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">z);<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">m&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;m);<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">10</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; ">11</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">12</span>&nbsp;<br /><br />如果不加上volatile关键字，在不同的编译器下有不同的结果，有的是10，有的是12，<br /><span style="color: #000000; ">加上volatile关键字后在gcc上就能得到正常的结果了，但是在VC下依旧不能得到想要的结果，一直没<br />也没想通为什么，希望知道结果的通知回帖。</span></div></font><span style="color: #000000; "></span></div><img src ="http://www.cppblog.com/sh19871122/aggbug/148847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2011-06-17 11:59 <a href="http://www.cppblog.com/sh19871122/archive/2011/06/17/148847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于某个类型转字符串和字符串转换某种类型的简单实现（用字符串流）</title><link>http://www.cppblog.com/sh19871122/archive/2011/06/09/148361.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Thu, 09 Jun 2011 10:22:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2011/06/09/148361.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/148361.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2011/06/09/148361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/148361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/148361.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><font class="Apple-style-span" color="#008080"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;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: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />T&nbsp;from_string(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">s)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::istringstream&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">(s);<br />&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;type;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;type;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;t;<br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;to_string(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">type)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::ostringstream&nbsp;s;<br />&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;type;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;s.str();<br />}<br /><br />直接用字符串流方便的处理了各种内嵌类型<br /><br /><br />做个标记，回家了</span></div></font></div><img src ="http://www.cppblog.com/sh19871122/aggbug/148361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2011-06-09 18:22 <a href="http://www.cppblog.com/sh19871122/archive/2011/06/09/148361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>许久没用C &amp; C++了，写个struct 和 class得思考</title><link>http://www.cppblog.com/sh19871122/archive/2011/05/20/146834.html</link><dc:creator>Hallelujah</dc:creator><author>Hallelujah</author><pubDate>Fri, 20 May 2011 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/sh19871122/archive/2011/05/20/146834.html</guid><wfw:comment>http://www.cppblog.com/sh19871122/comments/146834.html</wfw:comment><comments>http://www.cppblog.com/sh19871122/archive/2011/05/20/146834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sh19871122/comments/commentRss/146834.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sh19871122/services/trackbacks/146834.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C/C++ struct class 区别&nbsp;&nbsp;<a href='http://www.cppblog.com/sh19871122/archive/2011/05/20/146834.html'>阅读全文</a><img src ="http://www.cppblog.com/sh19871122/aggbug/146834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sh19871122/" target="_blank">Hallelujah</a> 2011-05-20 22:49 <a href="http://www.cppblog.com/sh19871122/archive/2011/05/20/146834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>