﻿<?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>IT博客-魔のkyo的工作室-随笔分类-STL</title><link>http://www.cnitblog.com/luckydmz/category/2852.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 17 Nov 2019 18:53:41 GMT</lastBuildDate><pubDate>Sun, 17 Nov 2019 18:53:41 GMT</pubDate><ttl>60</ttl><item><title>可变模版参数(variadic templates)</title><link>http://www.cnitblog.com/luckydmz/archive/2019/11/09/91946.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Sat, 09 Nov 2019 05:23:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2019/11/09/91946.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/91946.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2019/11/09/91946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/91946.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/91946.html</trackback:ping><description><![CDATA[<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">C++11引入了一个很强大的模板功能，即可变模板参数(variadic templates)，</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">它允许定义出<span style="color: #df402a;">可变参数个数</span>，同时<span style="color: #df402a;">可变参数类型</span>的模板，看一个简单的例子</div><div id="3967-1573271315506" data-theme="default" data-language="javascript" style="white-space: pre-wrap;">
<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; ">iostream</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; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<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; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />声明的Args称为模板参数包，注意<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />是写在typename后面的</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args)&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;这里的const&nbsp;Args&amp;<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />称为函数参数类型包，而声明出的args称为函数参数包</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;这里的args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />称为对函数参数包的展开</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">11</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; ">12</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;func(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">123</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; "><br /></span></div>
</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">输出为</div><div><div style="white-space: pre-wrap; padding: 0px 10px 0px 17px; border-left: 3px solid #e8e8e8; margin: 0px 5px;">Hello world 123</div></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">上面的展示很简单明确，现在我们基本知道可变模板参数是个什么东西了。那么它有什么用呢，下面我们来做一些稍微复杂一点的事，如果我们不用printf这样的接受可变长参数列表的函数作为输出，而使用cout该怎么修改上面的代码呢？下面我们稍作修改，<span style="font-weight: bold;">通过递归调用把参数一个一个拆出来</span>。</div><div id="9320-1573271876443" data-theme="default" data-language="javascript" style="white-space: pre-wrap;">
<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; ">iostream</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; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<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; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;递归终止</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func()<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; "><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; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T,&nbsp;typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;obj,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args)<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;obj&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;func(args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;递归调用</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">18</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; ">19</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;func(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">123</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">因为改成通过cin，前面的格式化字符串删掉了</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}</span></div>

</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">通过增加在模板参数包前面增加一个参数T接受一个参数，再把后面的所有参数递归调用，就实现了一个一个拆出来，最后的调用中args...是可以为0个参数的，这时候调用到了上面的重载函数func()什么都不做。我们可能会想，能不能不写一个空的func()直接在模板函数里面判断args携带的参数个数来终止递归呢，答案是：可以的，但没那么简单。取得可变模板参数的个数可以使用sizeof...()或tuple_size&lt;&gt;::value，下面实现一下</div><div id="5693-1573272773533" data-theme="default" data-language="javascript" style="white-space: pre-wrap;">
<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; ">iostream</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; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<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; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T,&nbsp;typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;obj,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args)<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;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;obj&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />(Args)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func(args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;递归调用</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</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; ">15</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;func(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">123</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">因为改成通过cin，前面的格式化字符串删掉了</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}<br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; "><br /></span></div>
</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">上面的代码试图通过判断sizeof...(Args)是否大于0决定是否继续递归，但是上面的代码会编译错误，因为if的判断是在运行期才做的，对func(args...)的调用在编译时就要有匹配的函数存在，而当args一个参数都没有时，编译器找不到匹配的函数进行调用（func至少接受一个参数T）。</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">所以问题的关键点是if分支是运行期的分支，如果我们做一个编译期的分支不就可以解决了么。</div><div id="6854-1573273964503" data-theme="default" data-language="javascript" style="white-space: pre-wrap;">
<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; ">iostream</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; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<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; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T,&nbsp;typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;obj,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args);<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; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;声明一个带有一个bool参数的模板struct</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;Flag</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;If_Func;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;下面对bool参数分别进行true/false两种特化实现，以此实现编译期的分支</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;If_Func</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;call&nbsp;(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args)&nbsp;{<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func(args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />);<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;If_Func</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;call(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args)&nbsp;{<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T,&nbsp;typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;obj,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Args</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;args)<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;obj&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;constexpr&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; "><img src="http://www.cnitblog.com/Images/dot.gif" alt="" />(Args)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;If_Func</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">flag</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::call(args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />);<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">39</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; ">40</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;func(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">123</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">因为改成通过cin，前面的格式化字符串删掉了</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}</span></div>

</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">上面引入了一个If_Func，这个东西从语法层面来说就是类模板和模板特化，不是新东西，但是这种用法一般被称为<span style="color: #df402a;">模板元编程</span>，C++1x里有一个头文件&lt;<span style="color: #df402a;">type_traits</span>&gt;里面提供了很多模板可以帮助我们进行各种判断，比如判断一个类型是否指针，是否POD，一个类是否是另一个类的子类，等等，可以辅助我们进行模板元编程，有兴趣的自行搜索了解。</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">下面我们讲另一个东西，元组(tuple)，它可以看成是对std::pair的n个元素扩充</div><div id="9866-1573275255880" data-theme="default" data-language="javascript" style="white-space: pre-wrap;"><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; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">tuple</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /><br /></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 />{<br />&nbsp;&nbsp;&nbsp;&nbsp;tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;make_tuple(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3.14</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;typeid(t).name()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::tuple_size</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">decltype(t)</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::value&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出tuple的元素个数</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(t)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出tuple的第0个元素</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(t)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出tuple的第1个元素</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(t)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出tuple的第2个元素</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}</span></div>
</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">这里不展开讲tuple的用法，我们注意，tuple的模板参数其实类型和数量都是可变的，事实上它就是利用了可变模板参数来实现的。怎么实现呢，大概是这样</div><div id="7712-1573276079036" data-theme="default" data-language="javascript" style="white-space: pre-wrap;"><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<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;my_tuple;<br /><br />template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;my_tuple</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br />{<br /><br />};<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T,&nbsp;typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;my_tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T,&nbsp;Args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;my_tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /><br /></span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;_obj;<br />};</span></div>
</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">通过递归继承的方式，每次把一个参数拆出来作为成员变量，其余的参数丢给基类，直到参数为空。</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">标准库并没有实现tuple的输出，现在产生一个问题，我们自己能否实现一个tuple的输出函数呢。</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">要实现的就是如果我们使用</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">cout &lt;&lt; make_tuple(123, 3.14, "Hello") &lt;&lt; endl;</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">可以像python里面</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">print( (123, 3.14, "Hello") )</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">输出元组一样，打印出类似 (123, 3.14, 'Hello')</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">我们要实现的函数原型是这样</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">template &lt;typename... Args&gt;</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">ostream&amp; operator &lt;&lt; (ostream&amp; out, const tuple&lt;Args...&gt; t);</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">直接给出代码，里面再次用到了所谓的模板元编程技巧。</div><div id="4187-1573276630545" data-theme="default" data-language="javascript" style="white-space: pre-wrap;">
<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; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">tuple</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sstream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">size_t&nbsp;N</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;PrintHelper;<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;PrintHelper</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;recursive_print(ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;t)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(t)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">size_t&nbsp;N</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;PrintHelper<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;recursive_print(ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;t)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintHelper</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::recursive_print(</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;t);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(t)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;print(ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;t)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintHelper</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::recursive_print(</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;t);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(t)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />&nbsp;Args</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(ostream</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;tuple</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Args<img src="http://www.cnitblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;t)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PrintHelper</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">tuple_size</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">decltype(t)</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::value&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::print(</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;t);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;PrintHelper&lt;sizeof<img src="http://www.cnitblog.com/Images/dot.gif" alt="" />(Args)&gt;::print(out,&nbsp;t);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;和上面等价</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">;<br />}<br /><br /></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 />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::make_tuple(</span><span style="color: #000000; ">123</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3.14</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />}</span></div>

</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">事实上这里会输出</div><div><div style="white-space: pre-wrap; padding: 0px 10px 0px 17px; border-left: 3px solid #e8e8e8; margin: 0px 5px;">(123, 3.14, Hello)</div></div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;">Hello的两端并没有引号，如果想加上引号，可以再次利用模板元编程技巧通过编译时的分支把string类型的输出方法特化，此处不再给出具体代码，留给读者自行探索。</div><div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"></div><img src ="http://www.cnitblog.com/luckydmz/aggbug/91946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2019-11-09 13:23 <a href="http://www.cnitblog.com/luckydmz/archive/2019/11/09/91946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost和C++1x最值得学习的库概览</title><link>http://www.cnitblog.com/luckydmz/archive/2019/11/08/91945.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Fri, 08 Nov 2019 10:05:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2019/11/08/91945.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/91945.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2019/11/08/91945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/91945.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/91945.html</trackback:ping><description><![CDATA[<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">Boost库分两种</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">header-only的 和 header + lib的</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">大多数都是header-only的，直接包含头文件就可以用。header + lib由一组头文件和一个库文件构成，可以自己用下载下来的代码编译出库文件或者直接在网上下载对应版本编译好的库。</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">需要连接lib的有以下库：</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    <span style="color: #bfbfbf;">Boost.Chrono	已经标准化 </span><span style="color: #df402a;">std::chrono</span><span style="color: #bfbfbf;"> C++11</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    <span style="color: #df402a;">Boost.Context	C++的协程支持（Coroutine）</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    <span style="color: #bfbfbf;">Boost.Filesystem	已经标准化 </span><span style="color: #df402a;">std::filesystem</span><span style="color: #bfbfbf;"> C++17 处理文件和路径的</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.GraphParallel	是Boost.Graph库的扩展，为了支持并行和分布式计算，包含一些图算法</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.IOStreams	IO流，我觉得最大的特点是可以通过filter进行zlib, gzip 和 bzip2的压缩和解压</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.Locale	本地化库，最主要是解决字符编码转换的问题，还有些日期货币格式转换</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.Log		日志库</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.MPI		用于分布式计算中的消息传递</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    <span style="color: #df402a;">Boost.ProgramOptions	读取 命令行参数 或 配置文件</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.Python	和pyhon的交互框架</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    <span style="color: #bfbfbf;">Boost.Regex	已经标准化</span><span style="color: #df402a;">std::regex</span><span style="color: #bfbfbf;"> C++11</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.Serialization	序列化</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.Signals	信号槽模式的一个实现</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    <span style="color: #bfbfbf;">Boost.Thread	已经标准化</span><span style="color: #df402a;">std::thread</span><span style="color: #bfbfbf;"> C++11</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">   <span style="color: #bfbfbf;"> Boost.Timer		计时器，可以用std::chrono::high_resolution_clock自己实现，所以没必要</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">    Boost.Wave		C++预处理器，似乎是为了方便编写一些对C++代码进行预处理的代码</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">以上被标记为红色的我觉得比较有用，可以学习一下，此外包括header-only的一些库，很多都已经被标准化，这些被标准化的往往是比较有用的，我找了了一下大概有下面这些：</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">&lt;functional&gt; std::bind / std::function / std::ref / std::cref</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">&lt;type_traits&gt; std::is_pod / std::is_base_of / std::enable_if / std::result_of / auto / decltype</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">数组封装 std::array 和vector比固定大小，和原生[]数组比不会退化为指针，有迭代器</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">任意类型 std::any</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">可选类型 std::optional / std::nullopt</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">正则表达式 std::regex</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">编译时分数 std::ratio</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">指针增强 std::shared_ptr  / std::weak_ptr / std::unique_ptr</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">n元组 std::tuple / std::make_tuple / std::get</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">多线程和锁 std::thread / std::mutex / std::lock_guard / std::unique_lock / std::atomic</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">时钟 std::chrono::high_resolution_clock / std::chrono::system_clock / std::chrono::steady</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">HASH表 std::unordered_map / std::unordered_set / std::hash</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="color: #df402a;">静态断言 static_assert</span></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"></div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">我把相关联的东西合并在了一行，这些可以说是C++1x新标准最值得学习的内容。</div><img src ="http://www.cnitblog.com/luckydmz/aggbug/91945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2019-11-08 18:05 <a href="http://www.cnitblog.com/luckydmz/archive/2019/11/08/91945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用c++的traits技术实现的任意类型元素的表达式求值</title><link>http://www.cnitblog.com/luckydmz/archive/2008/09/20/49295.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Fri, 19 Sep 2008 17:51:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2008/09/20/49295.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/49295.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2008/09/20/49295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/49295.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/49295.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这里以整形和浮点型表达式为例。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include&nbsp;&lt;iostream&gt;#include&nbsp;&lt;string&gt;#include&nbsp;&lt;cmath&gt;...&nbsp;&nbsp;<a href='http://www.cnitblog.com/luckydmz/archive/2008/09/20/49295.html'>阅读全文</a><img src ="http://www.cnitblog.com/luckydmz/aggbug/49295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2008-09-20 01:51 <a href="http://www.cnitblog.com/luckydmz/archive/2008/09/20/49295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL:bitset的使用</title><link>http://www.cnitblog.com/luckydmz/archive/2007/07/07/29602.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Sat, 07 Jul 2007 14:24:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2007/07/07/29602.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/29602.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2007/07/07/29602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/29602.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/29602.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bitset</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;bitset</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;mask(</span><span style="COLOR: #000000">0xFFFFFF00</span><span style="COLOR: #000000">);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mask&nbsp;=&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;mask&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;bitset</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Enter&nbsp;a&nbsp;32-bit&nbsp;bitset&nbsp;in&nbsp;binary:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;flush;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(cin&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;x)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">As&nbsp;ulong:&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;x.to_ulong()&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">And&nbsp;with&nbsp;mask:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;(x&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;mask)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Or&nbsp;with&nbsp;mask:&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;(x&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;mask)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span></div>
<img src ="http://www.cnitblog.com/luckydmz/aggbug/29602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2007-07-07 22:24 <a href="http://www.cnitblog.com/luckydmz/archive/2007/07/07/29602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用自己的函数对象定义sort,priority_queue,map,set中的序</title><link>http://www.cnitblog.com/luckydmz/archive/2007/07/05/29533.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Thu, 05 Jul 2007 11:14:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2007/07/05/29533.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/29533.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2007/07/05/29533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/29533.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/29533.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">functional</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdlib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">queue</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Node{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;data;<br>&nbsp;&nbsp;&nbsp;&nbsp;Node(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;Node(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n){data</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">n;}<br>};<br><br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;myCmp&nbsp;:&nbsp;binary_function</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Node,Node,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;()&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Node</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a,</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Node</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a.data&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;b.data;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br>根据实践即便不从&nbsp;binary_function&nbsp;派生也是可以使用的&nbsp;<br>class&nbsp;myCmp{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator&nbsp;()&nbsp;(const&nbsp;Node&amp;&nbsp;a,const&nbsp;Node&amp;&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.data&nbsp;&lt;&nbsp;b.data;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;priority_queue</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Node,vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Node</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">,myCmp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;PQ;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Node,myCmp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;S;<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;arr[</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;sort(arr,arr</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,myCmp());<br>}<br></span></div>
<img src ="http://www.cnitblog.com/luckydmz/aggbug/29533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2007-07-05 19:14 <a href="http://www.cnitblog.com/luckydmz/archive/2007/07/05/29533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL学习笔记－－sort,less</title><link>http://www.cnitblog.com/luckydmz/archive/2006/05/24/11003.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Wed, 24 May 2006 08:12:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2006/05/24/11003.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/11003.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2006/05/24/11003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/11003.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/11003.html</trackback:ping><description><![CDATA[sort算法的原型如下，使用sort需要包含algorithm头文件<br />template &lt;class <a href="mk:@MSITStore:C:\Downloads\STL_Programmer_Guide.chm::/RandomAccessIterator.shtml.htm" tppabs="http://codeguru.developer.com/cpp/stlguide/RandomAccessIterator.shtml">RandomAccessIterator</a>&gt;<br />void sort(RandomAccessIterator first, RandomAccessIterator last);<br /><br />template &lt;class RandomAccessIterator, class <a href="mk:@MSITStore:C:\Downloads\STL_Programmer_Guide.chm::/StrictWeakOrdering.shtml.htm" tppabs="http://codeguru.developer.com/cpp/stlguide/StrictWeakOrdering.shtml">StrictWeakOrdering</a>&gt;<br />void sort(RandomAccessIterator first, RandomAccessIterator last,<br />          StrictWeakOrdering comp);<br /><br />将sort算法作用于一个存放自定义对象的容器时，如果使用第一种调用方式，那么comp默认使用<font face="Courier New" size="2">less函数对象(function object)进行比较，less函数对象需要自定义的对象（即：容器中的对象）有"operator &lt;"运算。<br />同样，greater函数对象需要使用对象的"operator &gt;"运算。<br /></font>（less_equal，greater_equalye依此类推）<br /><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">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdlib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br /><br /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C{<br />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> data;<br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br />    C(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">){data</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">n;}<br />    friend </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> C </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> C </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b);<br />    friend ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> (ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> stream , </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> C </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ob);<br /><br />};<br /><br />inline </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> C </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> C </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b)<br />{<br />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (a.data </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> b.data);<br />}    <br /><br />ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> (ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> stream , </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> C </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ob)<br />{<br />    stream</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">ob.data;<br />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> stream;<br />}<br /><br /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main ()<br />{<br />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i;<br />    vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> a(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">){<br />        a[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i;<br />    }<br />    sort(a.begin(),a.end(),less</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">() );<br />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">){<br />        cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">a[i]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br />    }<br />    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />}<br /></span></div><img src ="http://www.cnitblog.com/luckydmz/aggbug/11003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2006-05-24 16:12 <a href="http://www.cnitblog.com/luckydmz/archive/2006/05/24/11003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>号称唯美主义的杰作</title><link>http://www.cnitblog.com/luckydmz/archive/2006/05/06/10145.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Sat, 06 May 2006 10:43:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2006/05/06/10145.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/10145.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2006/05/06/10145.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/10145.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/10145.html</trackback:ping><description><![CDATA[先记下来，慢慢研究<br /><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">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iterator</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><br /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std; <br /><br /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br />{<br />    typedef vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">    int_vector;<br />    typedef istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">    istream_itr;<br />    typedef ostream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">    ostream_itr;<br />    typedef back_insert_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> int_vector </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> back_ins_itr;<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> STL中的vector容器</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    int_vector num;<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从标准输入设备读入整数，<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 直到输入的是非整型数据为止</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    copy(istream_itr(cin), istream_itr(), back_ins_itr(num));<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> STL中的排序算法</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    sort(num.begin(), num.end());<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 将排序结果输出到标准输出设备</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    copy(num.begin(), num.end(), ostream_itr(cout, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><br />    cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />}<br /></span></div><img src ="http://www.cnitblog.com/luckydmz/aggbug/10145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2006-05-06 18:43 <a href="http://www.cnitblog.com/luckydmz/archive/2006/05/06/10145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习使用标准模板库(STL)</title><link>http://www.cnitblog.com/luckydmz/archive/2006/05/04/10043.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Thu, 04 May 2006 05:42:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2006/05/04/10043.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/10043.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2006/05/04/10043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/10043.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/10043.html</trackback:ping><description><![CDATA[
		<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">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">iostream</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">vector</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 动态数组<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">#include &lt;list&gt; </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 双向线性表<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">#include &lt;stack&gt; </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 堆栈 </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">algorithm</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #0000ff">using</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">namespace</span>
				<span style="COLOR: #000000"> std;<br /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main()<br />{<br />    vector</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> v;<br />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">size:</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">v.size()</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /><br />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">初始化v </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> c;<br />    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (c </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">A</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">;c</span>
				<span style="COLOR: #000000">&lt;=</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">Z</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">;c</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">)<br />        v.push_back(c);<br />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">size:</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">v.size()</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br />    <br />    vector</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">::iterator p,q;<br />    <br />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">输出(通过迭代器访问) </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">    p</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">v.begin();q</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">v.end();<br />    </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000"> (p</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">q)<br />        cout</span>
				<span style="COLOR: #000000">&lt;&lt;*</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">++&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br />    cout </span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000"> endl;<br />    <br />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">将v全部反序 </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">    reverse(v.begin(),v.end()); </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">需要头文件&lt;algorithm&gt;<br />    <br />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">再次输出(通过下标访问) </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000"> ;i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">v.size();i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">)<br />        cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">v[i]</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /><br />    </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000"> ;<br />}</span>
		</div>
		<br />标准模板库是个好东西,不用我们再去"发明车轮"了<img src ="http://www.cnitblog.com/luckydmz/aggbug/10043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2006-05-04 13:42 <a href="http://www.cnitblog.com/luckydmz/archive/2006/05/04/10043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>