<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nicolás Brailovsky &#187; Templates</title>
	<atom:link href="http://nicolasb.com.ar/category/programming/c/templates/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicolasb.com.ar</link>
	<description>A modern blog</description>
	<lastBuildDate>Tue, 20 Dec 2011 09:00:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Cool C++0X features XII: type inference with auto</title>
		<link>http://nicolasb.com.ar/2011/10/cool-c0x-features-xii-type-inference-with-auto/</link>
		<comments>http://nicolasb.com.ar/2011/10/cool-c0x-features-xii-type-inference-with-auto/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 10:00:17 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1399</guid>
		<description><![CDATA[In the last four entries we worked on a simple example, like the one I&#8217;m pasting below, of type inference with decltype, which led us to learn about delayed type declaration and decltypes with auto. This time I want to focus just on the auto keyword instead. template &#60;class&#8230; Args&#62; auto wrap&#40;Args&#8230; a&#41; -&#62; decltype&#40; [...]]]></description>
			<content:encoded><![CDATA[<p>In the last four entries we worked on a simple example, like the one I&#8217;m pasting below, of type inference with decltype, which led us to learn about <a href="http://nicolasb.com.ar/2011/06/cool-c0x-features-ix-delayed-type-declaration">delayed type declaration</a> and <a href="http://nicolasb.com.ar/2011/06/cool-c0x-features-x-type-inference-with-decltype">decltypes with auto</a>. This time I want to focus just on the auto keyword instead.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We saw <a href="http://nicolasb.com.ar/2011/06/cool-c0x-features-x-type-inference-with-decltype">last time</a> how decltype can be used in a contrived way to create a local variable without specifying its type, only how to deduce the type for this variable. Luckily, that verbose method of type declaration can be summed up in the following way:</p>
<table width="100%">
<tbody>
<tr>
<td>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> x = <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> y = <span class="nu0">3</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; decltype<span class="br0">&#40;</span>x*y<span class="br0">&#41;</span> z = x*y;</div>
</li>
</ol>
</div>
</td>
<td>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> x = <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> y = <span class="nu0">3</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">auto</span> z = x*y;</div>
</li>
</ol>
</div>
</td>
</tr>
</tbody>
</table>
<p>That&#8217;s right, when you are declaring local variables it&#8217;s easier and cleaner to just use auto. This feature isn&#8217;t even &#8220;in the wild&#8221; yet, so you can&#8217;t really predict what will people do with it, but it seems to me that limiting its use to local variables with a very short lived scope is the best strategy. We are yet to see what monstrosities the abuse of this feature will produce, and I&#8217;m sure there will be many. Regardless of their potential to drive insane any maintainers, its best use probably comes in loops.</p>
<p>In any C++ application, you&#8217;ll find code like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span>FooContainer&lt;Bar&gt;::<span class="me2">const_iterator</span> i = foobar.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; i != foobar.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; ++i<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>This ugly code can be eliminated with something much more elegant:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">auto</span> i = foobar.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; i != foobar.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; ++i<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Looks nicer indeed, but we can improve it much further with other tools. We&#8217;ll see how the next time. For the time being, let&#8217;s see for waht what auto is not to be used.</p>
<p>When using auto, keep in mind it was designed to simplify the declaration of a variable with a complex or difficult to reason type, not as a replacement for other language features like templates. This is a common mistake:</p>
<table width="100%">
<tbody>
<tr>
<td>Wrong</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> f<span class="br0">&#40;</span><span class="kw4">auto</span> x<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; x;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</td>
<td>Right</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">template &lt;T&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> f<span class="br0">&#40;</span>T x<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; x;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</td>
</tr>
</tbody>
</table>
<p>It makes no sense to use auto in the place of a template, since a template means that the type will be completed later whereas auto means it should be deduced from an initializer.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/10/cool-c0x-features-xii-type-inference-with-auto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features X: type inference with decltype</title>
		<link>http://nicolasb.com.ar/2011/06/cool-c0x-features-x-type-inference-with-decltype/</link>
		<comments>http://nicolasb.com.ar/2011/06/cool-c0x-features-x-type-inference-with-decltype/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 10:00:46 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1395</guid>
		<description><![CDATA[After creating a wrapper object on the last entries, we were left with three syntax changes two analyze: -&#62; (delayed declaration) decltype auto We already saw the first, and we&#8217;ll be talking about the other two this time. This was the original wrapper function which led us here: &#160; template &#60;class&#8230; Args&#62; auto wrap&#40;Args&#8230; a&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>After creating a <a href="http://nicolasb.com.ar/2011/03/cool-c0x-features-viii-variadic-wrapper-and-type-inference-with-decltype">wrapper object</a> on the last entries, we were left with three syntax changes two analyze:</p>
<ul>
<li><a href="http://nicolasb.com.ar/2011/03/cool-c0x-features-ix-delayed-type-declaration">-&gt; (delayed declaration)</a></li>
<li>decltype</li>
<li>auto</li>
</ul>
<p>We already saw the first, and we&#8217;ll be talking about the other two this time. This was the original wrapper function which led us here:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Back on topic:</p>
<p><b>decltype</b><br />
This operator (yes, decltype is an operator) is a cousin of sizeof which will yield the type of an expression. Why do I say it&#8217;s a cousin of sizeof? Because it&#8217;s been in the compilers for a long time, only in disguise. This is because you can&#8217;t get the size of an expression without knowing it&#8217;s type, so even though it&#8217;s implementation has existed for a long time only now it&#8217;s available to the programmer.</p>
<p>One of it&#8217;s interesting features is that the expression with which you call decltype won&#8217;t be evaluated, so you can safely use a function call within a decltype, like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> foo<span class="br0">&#40;</span><span class="kw4">int</span> x<span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> bar<span class="br0">&#40;</span>x<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> bar<span class="br0">&#40;</span>x<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Doing this with, say, a macro, would get bar(x) evaluated twice, yet with decltype it will be evaluated only once. Any valid C++ expression can go within a decltype operator, so for example this is valid too:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;typename A, typename B&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> multiply<span class="br0">&#40;</span>A x, B y<span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> x*y <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> x*y;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>What&#8217;s the type of A and B? What&#8217;s the type of A*B? We don&#8217;t care, the compiler will take care of that for us. Let&#8217;s look again at that example, more closely:</p>
<p><b>-&gt; (delayed declaration) and decltype</b></p>
<p>Why bother creating a delayed type declaration at all and not just use the decltype in place of the auto? That&#8217;s because of a scope problem, see this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Declare a template function receiving two types as param</span></div>
</li>
<li class="li1">
<div class="de1">template &lt;typename A, typename B&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// If we are declaring a multiplication operation, what&#8217;s the return type of A*B?</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// We can&#8217;t multiply classes, and we don&#8217;t know any instances of them</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> multiply<span class="br0">&#40;</span>A x, B y<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Luckily, the method signature now defined both parameters, meaning</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// we don&#8217;t need to expressly know the type of A*B, we just evaluate</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// x*y and use whatever type that yields</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; -&gt; decltype<span class="br0">&#40;</span> x*y <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> x*y;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p><b>decltype</b><br />
As you see, decltype can be a very powerful tool if the return type of a function is not known for the programmer when writing the code, but you can use it to declare any type, anywhere, if you are too lazy to type. If you, for example, are very bad at math and don&#8217;t remember that the integers group is closed for multiplication, you could write this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> x = <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> y = <span class="nu0">3</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; decltype<span class="br0">&#40;</span>x*y<span class="br0">&#41;</span> z = x*y;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Yes, you can use it as VB&#8217;s dim! (kidding, just kidding, please don&#8217;t hit me). Even though this works and it&#8217;s perfectly legal, auto is a better option for this. We&#8217;ll see that on the next entry.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/06/cool-c0x-features-x-type-inference-with-decltype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features IX: delayed type declaration</title>
		<link>http://nicolasb.com.ar/2011/06/cool-c0x-features-ix-delayed-type-declaration/</link>
		<comments>http://nicolasb.com.ar/2011/06/cool-c0x-features-ix-delayed-type-declaration/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 10:00:44 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1392</guid>
		<description><![CDATA[In the last two entries we worked on a wrapper object which allows us to decorate a method before or after calling (hello aspects!), or at least that&#8217;s what it should do when g++ fully implements decltypes and variadic templates. Our wrapper function looks something like this (check out the previous entry for the wrapper [...]]]></description>
			<content:encoded><![CDATA[<p>In the last two entries we worked on a wrapper object which allows us to decorate a method before or after calling (hello aspects!), or at least that&#8217;s what it should do when g++ fully implements decltypes and variadic templates. Our wrapper function looks something like this (check out the previous entry for the wrapper object):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> do_something<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="kw1">return</span> <span class="nu0">123</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="st0">&quot;nice&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> x = wrap<span class="br0">&#40;</span><span class="nu0">42</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; x &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>After the example, we were left with three new syntax changes to analyze:</p>
<ul>
<li>-&gt; (delayed declaration)</li>
<li>decltype</li>
<li>auto</li>
</ul>
<p>Let&#8217;s study the -&gt; operator this time:</p>
<p><b>-&gt; (delayed declaration)</b><br />
This is the easiest one. When a method is declared auto (I&#8217;ve left this one for the end because auto is used for other things too) it means its return type will be defined somewhere else. Note that in this regard the final implementation differs from <a href="http://www2.research.att.com/~bs/C++0xFAQ.html#suffix-return">Stroustroup&#8217;s FAQ</a>.</p>
<p>The -&gt; operator in a method&#8217;s definition says &#8220;Here&#8217;s the return type&#8221;. I&#8217;ll paste the same simple example we had last time, the following two snippets of code are equivalent:</p>
<table width="100%">
<tr>
<td>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
</td>
<td>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> foo<span class="br0">&#40;</span><span class="br0">&#41;</span> -&gt; <span class="kw4">void</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/06/cool-c0x-features-ix-delayed-type-declaration/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features VIII: Variadic wrapper and type inference with decltype</title>
		<link>http://nicolasb.com.ar/2011/05/cool-c0x-features-viii-variadic-wrapper-and-type-inference-with-decltype/</link>
		<comments>http://nicolasb.com.ar/2011/05/cool-c0x-features-viii-variadic-wrapper-and-type-inference-with-decltype/#comments</comments>
		<pubDate>Tue, 31 May 2011 10:00:08 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1388</guid>
		<description><![CDATA[The wrapper function we built last time looks something like this now: #include &#60;iostream&#62; &#160; void do_something&#40;&#41; &#123; std::cout &#60;&#60; __PRETTY_FUNCTION__ &#60;&#60; &#34;\n&#34;; &#125; void do_something&#40;const char*&#41; &#123; std::cout &#60;&#60; __PRETTY_FUNCTION__ &#60;&#60; &#34;\n&#34;; &#125; &#160; template &#60;class&#8230; Args&#62; void wrap&#40;Args&#8230; a&#41; &#123; &#160; &#160; &#160; &#160; std::cout &#60;&#60; __PRETTY_FUNCTION__ &#60;&#60; &#34;\n&#34;; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>The wrapper function we built last time looks something like this now:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="st0">&quot;nice&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>But, as we saw last time, this approach has the problem of requiring the return type of do_something to be known before hand. What can we do to remove this dependency? In C++, not much. You can&#8217;t really declare a type based on the return type of another function. You do have the option of using lots of metaprogramming wizardy, but this is both error prone and ugly (see <a href="http://www2.research.att.com/~bs/C++0xFAQ.html#suffix-return">Stroustroup&#8217;s C++0x FAQ</a>).</p>
<p>C++0x lets you do some magic with type inference using decltype; decltype(expr) will yield the type of that expression. It works quite similarly as sizeof does; decltype is resolved at compile time and the expression with which it&#8217;s being called is not evaluated (more on this later).</p>
<p>How would this work on our example?</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> do_something<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="kw1">return</span> <span class="nu0">123</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="st0">&quot;nice&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> x = wrap<span class="br0">&#40;</span><span class="nu0">42</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; x &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Try it (remember to add -std=c++0x) it works great! The syntax is not so terribly difficult to grasp as it was with variadic templates. The auto keywords says &#8220;hey, compiler, the return type for this method will be defined later&#8221;, and then the -&gt; actually declares the return type. This means that the auto-gt idiom isn&#8217;t part of typedecl but a helper, which in turns means that even if not useful, this is valid C++0x code:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">auto</span> wrap<span class="br0">&#40;</span><span class="br0">&#41;</span> -&gt; <span class="kw4">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This means that we have three interesting components to analyze in this scenario:</p>
<ul>
<li>-&gt; (delayed declaration)</li>
<li>auto</li>
<li>decltype</li>
</ul>
<p>We&#8217;ll go over each one the next time.</p>
<p>Closing remark:</p>
<p>At first I choose the following example to introduce delayed return types and decltype (warning, untested code ahead):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Foo <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> do_something<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="kw1">return</span> <span class="nu0">123</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Untested code ahead</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// This makes g++ coredump (v 4.4.5)</span></div>
</li>
<li class="li1">
<div class="de1">template &lt;class T&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Wrap : public T <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">auto</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> -&gt; decltype<span class="br0">&#40;</span> T::<span class="me2">do_something</span><span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> T::<span class="me2">do_something</span><span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Wrap&lt;Foo&gt; w;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; w.<span class="me1">wrap</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; w.<span class="me1">wrap</span><span class="br0">&#40;</span><span class="st0">&quot;nice&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; w.<span class="me1">wrap</span><span class="br0">&#40;</span><span class="nu0">42</span><span class="br0">&#41;</span> &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Though this looks MUCH better (and useful), at the time of writing this article mixing variadic templates with decltypes in a template class makes g++ segfault. It should be valid C++, but I can&#8217;t assure it&#8217;s correct code since I&#8217;ve never tried it.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/05/cool-c0x-features-viii-variadic-wrapper-and-type-inference-with-decltype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features VII: A variadic wrapper solution</title>
		<link>http://nicolasb.com.ar/2011/05/cool-c0x-features-vii-a-variadic-wrapper-solution/</link>
		<comments>http://nicolasb.com.ar/2011/05/cool-c0x-features-vii-a-variadic-wrapper-solution/#comments</comments>
		<pubDate>Tue, 24 May 2011 10:00:36 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1385</guid>
		<description><![CDATA[Last time we were trying to build a wrapper function, in which we don&#8217;t control the class being wrapped nor the user of the wrapper (meaning we can&#8217;t change either of those but they could change without warning). This was the first approach: #include &#60;iostream&#62; &#160; void do_something&#40;&#41; &#123; std::cout &#60;&#60; __PRETTY_FUNCTION__ &#60;&#60; &#34;\n&#34;; &#125; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicolasb.com.ar/2011/03/cool-c0x-features-vi-a-variadic-wrapper">Last time</a> we were trying to build a wrapper function, in which we don&#8217;t control the class being wrapped nor the user of the wrapper (meaning we can&#8217;t change either of those but they could change without warning).</p>
<p>This was the first approach:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">void</span> wrap<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; do_something<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Yet, as we saw, it&#8217;s not scalable, when either part changes the whole things break. We proposed then a variadic template solution, which, if you tried it yourself, should look something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; do_something<span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="st0">&quot;nice&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s better. Now we don&#8217;t care about which parameters do_something should get, nor how many of them are there supposed to be, just how it&#8217;s called. If you read the <a href="http://nicolasb.com.ar/2011/03/cool-c0x-features-iii-variadic-templates-a-fix-for-varargs">previous entries on variadic templates</a> this should be a walk in the park. It still has a flaw though: we need to know the return type of do_something!</p>
<p>Is there a way to write a wrapper without knowing the return type of a function you are wrapping? Yes, in Ruby you can, but you can do it in C++0x too, and we&#8217;ll see how to do it next time.</p>
<p>A closing remark: You could do something like this wrapping everything in a class:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Foo <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;class Base&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Wrapper : public Base <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; template &lt;class&#8230; <span class="me1">Args</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> wrap<span class="br0">&#40;</span>Args&#8230; <span class="me1">a</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Base::<span class="me2">do_something</span><span class="br0">&#40;</span>a&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Wrapper&lt;Foo&gt; w;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; w.<span class="me1">wrap</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; w.<span class="me1">wrap</span><span class="br0">&#40;</span><span class="st0">&quot;nice&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The above works just fine, but due to some limitations in the current (stable) version of gcc we will use the former version (the problem with this form will be clear later, I promise).</p>
<p><a href="http://nicolasb.com.ar/archivos/2011/03/magnus_pyke_science.jpg"><img class="aligncenter size-medium wp-image-1349" title="magnus_pyke_science" src="http://nicolasb.com.ar/archivos/2011/03/magnus_pyke_science-300x204.jpg" alt="" width="300" height="204" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/05/cool-c0x-features-vii-a-variadic-wrapper-solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features VI: A variadic wrapper</title>
		<link>http://nicolasb.com.ar/2011/05/cool-c0x-features-vi-a-variadic-wrapper/</link>
		<comments>http://nicolasb.com.ar/2011/05/cool-c0x-features-vi-a-variadic-wrapper/#comments</comments>
		<pubDate>Tue, 17 May 2011 10:00:12 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1381</guid>
		<description><![CDATA[Let&#8217;s work on the last variadic exercise, a wrapper. Say you have something like this: &#160; #include &#60;iostream&#62; &#160; void do_something&#40;&#41; &#123; std::cout &#60;&#60; __PRETTY_FUNCTION__ &#60;&#60; &#34;\n&#34;; &#125; &#160; int main&#40;&#41; &#123; &#160; &#160; &#160; &#160; do_something&#40;&#41;; &#160; &#160; &#160; &#160; return 0; &#125; &#160; And you want to wrap do_something with something else (Remember [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s work on the last variadic exercise, a wrapper. Say you have something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; do_something<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>And you want to wrap do_something with something else (Remember <a href="http://nicolasb.com.ar/2010/06/c-pretty-functions/">__PRETTY_FUNCTION__</a>?). This is a solution, the worst one though:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> wrap<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; do_something<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; wrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Why is it so bad? Let&#8217;s say you don&#8217;t control do_something, you just control the wrapper. You may not even control main(), it may be beyond your scope. That means each time do_something changes, or adds an overload, you have to change your code. That&#8217;s ugly and you should already know how to set up a variadic function to forward the arguments to do_something. Give it a try, next time the solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/05/cool-c0x-features-vi-a-variadic-wrapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features V: Templates and angle brackets, a short interlude</title>
		<link>http://nicolasb.com.ar/2011/05/cool-c0x-features-v-templates-and-angle-brackets-a-short-interlude/</link>
		<comments>http://nicolasb.com.ar/2011/05/cool-c0x-features-v-templates-and-angle-brackets-a-short-interlude/#comments</comments>
		<pubDate>Tue, 10 May 2011 10:00:29 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1363</guid>
		<description><![CDATA[In the heart of C++ template metaprogramming and code obfuscation, lies the (ab)use of angle brackets. This seemingly innocent token can turn the most clean looking code into the mess that template-detractors like so much to complain about. C++0x doesn&#8217;t do much to clean up this mess, it&#8217;s probably impossible, but it does offer a [...]]]></description>
			<content:encoded><![CDATA[<p>In the heart of C++ template metaprogramming and code obfuscation, lies the (ab)use of angle brackets. This seemingly innocent token can turn the most clean looking code into the mess that template-detractors like so much to complain about.</p>
<p><a href="http://nicolasb.com.ar/archivos/2011/03/obfuscation.jpg"><img class="aligncenter size-medium wp-image-1364" title="obfuscation" src="http://nicolasb.com.ar/archivos/2011/03/obfuscation-240x300.jpg" alt="" width="240" height="300" /></a></p>
<p>C++0x doesn&#8217;t do much to clean up this mess, it&#8217;s probably impossible, but it does offer a subtle feature to improve the legibility of C++ template code, a nifty little feature we have (inadvertently) used.</p>
<p>Up to C++0x, having two angle brackets together (&gt;&gt;) was parsed as the shift operator (like the one cout uses), meaning that if you had nested templates a lot of compiler errors ensued. C++0x corrects this, meaning that code which in C++ would be like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Reduce&lt;Sum, Lst&lt;Num&lt;<span class="nu0">2</span>&gt;, Lst&lt;Num&lt;<span class="nu0">4</span>&gt;, Lst&lt;Num&lt;<span class="nu0">6</span>&gt;, Lst&lt; Num&lt;<span class="nu0">8</span>&gt; &gt; &gt; &gt; &gt; &gt;</div>
</li>
</ol>
</div>
<p>Can now be written like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Reduce&lt;Sum, Lst&lt;Num&lt;<span class="nu0">2</span>&gt;, Lst&lt;Num&lt;<span class="nu0">4</span>&gt;, Lst&lt;Num&lt;<span class="nu0">6</span>&gt;, Lst&lt; Num&lt;<span class="nu0">8</span>&gt;&gt;&gt;&gt;&gt;&gt;</div>
</li>
</ol>
</div>
<p>Aaand, back to the normal programming&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/05/cool-c0x-features-v-templates-and-angle-brackets-a-short-interlude/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features IV: Variadic templates again</title>
		<link>http://nicolasb.com.ar/2011/05/cool-c0x-features-iv-variadic-templates-again/</link>
		<comments>http://nicolasb.com.ar/2011/05/cool-c0x-features-iv-variadic-templates-again/#comments</comments>
		<pubDate>Tue, 03 May 2011 10:00:49 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1361</guid>
		<description><![CDATA[Last time we finally solved the varargs problem. Let&#8217;s review what we learned: Variadic templates let us create something receiving a variable set of arguments We can process the head of that set, then recursively process the tail It adds weird new syntax When declaring typename&#8230; T you are saying &#8220;here goes a list of [...]]]></description>
			<content:encoded><![CDATA[<p>Last time we finally solved the varargs problem. Let&#8217;s review what we learned:</p>
<ul>
<li>Variadic templates let us create something receiving a variable set of arguments</li>
<li>We can process the head of that set, then recursively process the tail</li>
<li>It adds weird new syntax
<ul>
<li>When declaring typename&#8230; T you are saying &#8220;here goes a list of types&#8221;</li>
<li>When declaring T&#8230; t you are saying t is a list of objects with different type</li>
<li>When you write t&#8230;, you are saying &#8220;expand the list of arguments&#8221;</li>
</ul>
</li>
<li>It&#8217;s type safe</li>
<li>It&#8217;s very neat to confuse your coworkers</li>
</ul>
<p>So, what can we do with it besides implementing our own version of printf? Let&#8217;s do something better, let&#8217;s try adding up a list of numbers to start flexing our variadic templatefooness (?).</p>
<p>What&#8217;s the usual way of adding a list of numbers? In templates, that is. We need something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">sum (H:T) &lt;- H + sum(T)
</div>
</li>
<li class="li1">
<div class="de1">sum () &lt;- 0</div>
</li>
</ol>
</div>
<p>Of course, in C++ templates you don&#8217;t have values, you just have types. We could implement it like this (if this looks like a new language you may want to check my <a href="http://nicolasb.com.ar/category/programming/c/templates/">template metaprogramming series</a>):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Nil<span class="br0">&#123;</span><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">template &lt;typename H, typename T=Nil&gt; <span class="kw4">struct</span> Lst <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> H Head;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> T Tail;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A, typename B&gt; class Op,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typename Head,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typename Lst&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> intForeach</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> typename intForeach</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt; Op, typename Lst::<span class="me2">Head</span>, typename Lst::<span class="me2">Tail</span> &gt;::<span class="me2">result</span> Next;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> typename Op&lt; Head, Next &gt;::<span class="me2">result</span> result;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">template &lt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A, typename B&gt; class Op,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typename Head&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> intForeach &lt;Op, Head, Nil&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> Head result;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typename Lst,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typename B&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; class Op&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Reduce</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> typename intForeach</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt; Op, typename Lst::<span class="me2">Head</span>, typename Lst::<span class="me2">Tail</span> &gt;::<span class="me2">result</span> result;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;int N&gt; <span class="kw4">struct</span> Num <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">const</span> <span class="kw4">static</span> <span class="kw4">int</span> value = N;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;typename A, typename B&gt; <span class="kw4">struct</span> Sum <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">static</span> <span class="kw4">const</span> <span class="kw4">int</span> r = A::<span class="me2">value</span> + B::<span class="me2">value</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> Num&lt;r&gt; result;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; Reduce&lt;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Lst&lt;Num&lt;<span class="nu0">2</span>&gt;, Lst&lt;Num&lt;<span class="nu0">4</span>&gt;, Lst&lt;Num&lt;<span class="nu0">6</span>&gt;, Lst&lt; Num&lt;<span class="nu0">8</span>&gt; &gt; &gt; &gt; &gt;,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Sum &gt;::<span class="me2">result</span>::<span class="me2">value</span> &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Nothing too fancy, plain old recursion with a sum. Yet it&#8217;s quite verbose, can we make this a little bit more terse and, hopefully, more clear? Yes, we can. Take a look at that Lst, Lst&lt;&#8230; It sucks. And it&#8217;s the perfect place to use variadic templates, we just need to construct a structure getting a list of ints, like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">template &lt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// The operation we wish to apply</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A, typename B&gt; class Op,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Current element to process</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; class H,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// All the rest</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; class&#8230; <span class="me1">T</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Reduce_V</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// TODO</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That one should look familiar from last time article. Now, to implement a reduce operation we need to operate the current element with the result of reducing the tail, so we have to do something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Remember how T&#8230; means to expand T for the next instance</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> typename Reduce_V&lt;Op, T&#8230;&gt;::<span class="me2">result</span> Tail_Result</div>
</li>
</ol>
</div>
<p>There&#8217;s something missing. Can you see what? The ending condition, of course. Let&#8217;s add it and we&#8217;ll get something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// The operation we wish to apply</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A, typename B&gt; class Op,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// All the rest</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; class&#8230; <span class="me1">T</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Reduce_V</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// The operation we wish to apply</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A, typename B&gt; class Op,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// All the rest</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; class H&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Reduce_V&lt;Op, H&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">typedef</span> H result;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">template &lt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// The operation we wish to apply</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; template&lt;typename A, typename B&gt; class Op,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Current element to process</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; class H,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// All the rest</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; class&#8230; <span class="me1">T</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> Reduce_V&lt;Op, H, T&#8230;&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Remember how T… means to expand T for the next instance</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw4">typedef</span> typename Reduce_V&lt;Op, T&#8230;&gt;::<span class="me2">result</span> Tail_Result;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Reduce current value with the next in line</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw4">typedef</span> typename Op&lt;H, Tail_Result&gt;::<span class="me2">result</span> result;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>And using it is very simple too:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; Reduce_V&lt; Sum, Num&lt;<span class="nu0">1</span>&gt;, Num&lt;<span class="nu0">2</span>&gt;, Num&lt;<span class="nu0">3</span>&gt;, Num&lt;<span class="nu0">4</span>&gt;&gt;::<span class="me2">result</span>::<span class="me2">value</span> &lt;&lt; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
</ol>
</div>
<p>Next time we&#8217;ll see another example for variadic templates and a new C++0x feature.</p>
<p><a href="http://nicolasb.com.ar/archivos/2011/03/magnus_pyke_science.jpg"><img class="aligncenter size-medium wp-image-1349" title="magnus_pyke_science" src="http://nicolasb.com.ar/archivos/2011/03/magnus_pyke_science-300x204.jpg" alt="" width="300" height="204" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/05/cool-c0x-features-iv-variadic-templates-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features III: Variadic templates, a fix for varargs</title>
		<link>http://nicolasb.com.ar/2011/04/cool-c0x-features-iii-variadic-templates-a-fix-for-varargs/</link>
		<comments>http://nicolasb.com.ar/2011/04/cool-c0x-features-iii-variadic-templates-a-fix-for-varargs/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 10:00:10 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1358</guid>
		<description><![CDATA[Last time we saw why a function with varargs may bring lots of problems. Then we saw how to solve it, but never explained why that last solution doesn&#8217;t have the problems the varargs solution had, nor how does it work. Let&#8217;s start by copying the solution here: // Stop condition void println&#40;&#41; &#123;&#125; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicolasb.com.ar/2011/03/cool-c0x-features-ii-variadic-templates-whats-wrong-with-varargs">Last time</a> we saw why a function with varargs may bring lots of problems. Then we saw how to solve it, but never explained why that last solution doesn&#8217;t have the problems the varargs solution had, nor how does it work. Let&#8217;s start by copying the solution here:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Stop condition</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> println<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// General case</span></div>
</li>
<li class="li2">
<div class="de2">template &lt;typename H, typename&#8230; <span class="me1">T</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> println<span class="br0">&#40;</span>H p, T&#8230; <span class="me1">t</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;println<span class="br0">&#40;</span>t&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;println<span class="br0">&#40;</span><span class="st0">&quot;Hola&quot;</span>, <span class="st0">&quot; mundo &quot;</span>, <span class="nu0">42</span>, <span class="st0">&#8216;<span class="es0">\n</span>&#8216;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>It certainly looks much better than the varargs function, even though some new strange syntax has been introduced. Keep in mind some <a href="http://nicolasb.com.ar/category/programming/c/templates/">template-foo</a> is required, not only because of the syntax but because we&#8217;ll be talking about functional programming too.</p>
<p><a href="http://nicolasb.com.ar/archivos/2011/03/science.jpg"><img class="aligncenter size-medium wp-image-1359" title="science" src="http://nicolasb.com.ar/archivos/2011/03/science-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>With all that intro (the last 2 articles were just an intro!) now we are in a good shape to ask what a variadic template really is. In its easiest form, it&#8217;s just a list of template arguments, like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">template &lt;typename&#8230; <span class="me1">T</span>&gt; <span class="kw4">void</span> foo<span class="br0">&#40;</span>T&#8230; <span class="me1">t</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>That simple template can accept as many parameters as you need, of any type. This is much safer than a vararg because:</p>
<ul>
<li>Doesn&#8217;t require the user to specify the number of args passed to foo, so it just can&#8217;t get out of sync</li>
<li>It&#8217;s typesafe; since C++ templates are type-safe, variadic templates are type safe too. You won&#8217;t be able to request an int where a char is required, you&#8217;ll just get a compiler error.</li>
<li>Compile time check: you get type safety just because this is all compiled code. If it doesn&#8217;t compile, you get an error (albeit a little cryptic).</li>
<li><a href="http://nicolasb.com.ar/2010/04/pod-types-in-c/">POD types</a> support</li>
<li>Better performance; small gain, but a gain indeed. Since this is all done in compile time there&#8217;s no need to handle the stack dynamically, nor of having a loop getting the args. It&#8217;s all known when you compile, thus the compiler can just optimize the hell out of everything</li>
</ul>
<p>Pretty neat, huh? But how does it work? Variadic templates are actually very similar to how Haskell handles lists, you get all the arguments as a list of types in which you can either get the head or the tail. To do something useful, get the head and continue processing the tail recursively.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">template &lt;typename H, typename&#8230; <span class="me1">T</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span>H h, T&#8230; <span class="me1">t</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Do something useful with h</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; really_do_something<span class="br0">&#40;</span>h<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Continue processing the tail</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; do_something<span class="br0">&#40;</span>t&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Of course, you&#8217;ll eventually need a condition to stop processing: (we&#8217;ll explain the new syntax later)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> do_something<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Do nothing <img src='http://nicolasb.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>When the list is completely processed the empty do_something function will be called. Easy, right? But it does have a lot of weird syntax. Let&#8217;s see what each of those ellipses mean:</p>
<ul>
<li>When declaring typename&#8230; T you are saying &#8220;here goes a list of types&#8221;. That is, when you use ellipses after the typename (or class) declaration but before the name of the type, then you are expecting a list of types there.</li>
<li>When declaring T&#8230; t you are saying t is a list of objects with different type. That is, you declared T&#8230; as a type which holds a list of types, therefore t, of type T, is an instance of a list of objects, each of different type</li>
<li>When you write t&#8230;, you are saying &#8220;expand the list of arguments&#8221;. You declared t as a list of objects, but you have no way of accessing each of those objects, just to the list as a whole. When you write the name of the object followed by ellipses, you are saying expand these types and their instance for the called function</li>
</ul>
<p>With all that in mind, let&#8217;s put together our typesafe printf:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Condition to stop processing</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> println<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Println receieves a list of arguments. We don&#8217;t know it&#8217;s type nor</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// how many there are, so we just get the head and expand the rest</span></div>
</li>
<li class="li1">
<div class="de1">template &lt;typename H, typename&#8230; <span class="me1">T</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> println<span class="br0">&#40;</span>H p, T&#8230; <span class="me1">t</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Do something useful with the head</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Expand the rest (pass it recursively to println)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; println<span class="br0">&#40;</span>t&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// See how it works even better than varargs?</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;println<span class="br0">&#40;</span><span class="st0">&quot;Hola&quot;</span>, <span class="st0">&quot; mundo &quot;</span>, <span class="nu0">42</span>, <span class="st0">&#8216;<span class="es0">\n</span>&#8216;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Next time, we&#8217;ll see a more complex (and fun) example of variadic templates.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/04/cool-c0x-features-iii-variadic-templates-a-fix-for-varargs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool C++0X features II, Variadic templates: What&#8217;s wrong with varargs</title>
		<link>http://nicolasb.com.ar/2011/04/cool-c0x-features-ii-variadic-templates-whats-wrong-with-varargs/</link>
		<comments>http://nicolasb.com.ar/2011/04/cool-c0x-features-ii-variadic-templates-whats-wrong-with-varargs/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 10:00:12 +0000</pubDate>
		<dc:creator>nico</dc:creator>
				<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://nicolasb.com.ar/?p=1353</guid>
		<description><![CDATA[Last time we explained what variadic templates are. We&#8217;ll see what they can do now. We mentioned that solving the problem of having a type-safe varargs is one of the best ways of applying variadic templates, but what&#8217;s varargs? Varargs functions (from C world, not even from C++!) are functions which have a variable number [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicolasb.com.ar/2011/03/cool-c0x-features-i/">Last time</a> we explained what variadic templates are. We&#8217;ll see what they can do now. We mentioned that solving the problem of having a type-safe varargs is one of the best ways of applying variadic templates, but what&#8217;s varargs?</p>
<p style="text-align: center;"><a href="http://nicolasb.com.ar/archivos/2009/07/cpp.jpg"><img class="aligncenter size-medium wp-image-492" title="cpp" src="http://nicolasb.com.ar/archivos/2009/07/cpp-255x300.jpg" alt="" width="153" height="180" /></a></p>
<p>Varargs functions (from C world, not even from C++!) are functions which have a variable number of arguments, just like printf. These are usually very dangerous functions, since they are not typesafe. Let&#8217;s see how they are implemented with an example:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdarg.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// My god, it&#8217;s full of bugs</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">void</span> va_println<span class="br0">&#40;</span><span class="kw4">int</span> args_left, &#8230;<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_list arg_lst;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_start<span class="br0">&#40;</span>arg_lst, args_left<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>args_left&#8211;<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw4">const</span> <span class="kw4">char</span> *p = va_arg<span class="br0">&#40;</span>arg_lst, <span class="kw4">const</span> <span class="kw4">char</span>*<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_end<span class="br0">&#40;</span>arg_lst<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_println<span class="br0">&#40;</span><span class="nu0">3</span>, <span class="st0">&quot;Hola &quot;</span>, <span class="st0">&quot;mundo&quot;</span>, <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This implementation of a function with variable arguments is, more or less, the best C can give us, yet it riddled with bugs and hidden problems. Let&#8217;s go one by one:</p>
<p><strong>Arg num will get out of sync</strong><br />
You need to specify the list of args as well as how many you have. That WILL get out of sync. Trust me, it&#8217;s just a mater of time. And when it does, you&#8217;ll have a coredump.</p>
<p><strong>Type-unsafe</strong><br />
You just tell varargs &#8220;Hey, get me an int&#8221;. And it will give you an int, no warranties included. If it was supposed to be a short instead, though luck, you end up with a coredump.</p>
<p><strong>No, really, coredump</strong><br />
Where are so many coredumps coming from, you may ask. Easy, varargs it&#8217;s just a way of handling the stack. Calling va_arg just moves the stack pointer by the sizeof the datatype you requested. That means no compile-time checks are included.</p>
<p><strong>No pod types</strong><br />
Remember POD types? Try running this code:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdarg.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> X <span class="br0">&#123;</span> virtual ~X<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> va_println<span class="br0">&#40;</span><span class="kw4">int</span> args_left, &#8230;<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_list arg_lst;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;va_start<span class="br0">&#40;</span>arg_lst, args_left<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>args_left&#8211;<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; X *p = va_arg<span class="br0">&#40;</span>arg_lst, X*<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_end<span class="br0">&#40;</span>arg_lst<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;X x, y, z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;va_println<span class="br0">&#40;</span><span class="nu0">3</span>, x, y, z<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p><strong>And how do we fix it?</strong><br />
The fix is easy. Too easy. You just need C++0X. We will discuss why this is better next time, but just as a sneak peak:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> println<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">template &lt;typename H, typename&#8230; <span class="me1">T</span>&gt; <span class="kw4">void</span> println<span class="br0">&#40;</span>H p, T&#8230; <span class="me1">t</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;std::<a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;println<span class="br0">&#40;</span>t&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;println<span class="br0">&#40;</span><span class="st0">&quot;Hola&quot;</span>, <span class="st0">&quot; mundo &quot;</span>, <span class="nu0">42</span>, <span class="st0">&#8216;<span class="es0">\n</span>&#8216;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Remember to compile using -std=c++0x in gcc.</p>
<p><strong>(Thanks Hugo Arregui for correcting the POD example)</strong></p>
<p><a href="http://nicolasb.com.ar/archivos/2010/08/Witchcraft.jpg"><img class="aligncenter size-medium wp-image-1173" title="Witchcraft" src="http://nicolasb.com.ar/archivos/2010/08/Witchcraft-300x176.jpg" alt="" width="300" height="176" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://nicolasb.com.ar/2011/04/cool-c0x-features-ii-variadic-templates-whats-wrong-with-varargs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

