<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4897229266633089840</id><updated>2012-02-15T23:35:48.380-08:00</updated><category term='C++0x'/><category term='generic programming'/><title type='text'>Bx12</title><subtitle type='html'>This blog will serve as a diary/reminder of whatever I'm working on or thinking about. My primary interests are C++ (the template programming variety) and statistics.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bx12.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4897229266633089840/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bx12.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>BX12</name><uri>http://www.blogger.com/profile/10621772316425736125</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4897229266633089840.post-5626420022873634476</id><published>2010-04-01T15:38:00.000-07:00</published><updated>2010-04-01T22:43:46.597-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='generic programming'/><title type='text'>Converting an MPL sequence to a variadic class template</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just as a function can be overloaded on the number of arguments, in C++, it would be nice to do something similar with a class template, i.e. specialize on the number of template arguments. Would be? That's what variadic class templates (VCT) do. However, one may need instead a class template with exactly one template parameter that is supposed to be instantiated with an MPL sequence (containing the arguments). Let's denote it SCT.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;VCT and SCT can be bridged using preprocessing macros, but this post looks at how to avoid this as much as as possible. To make an SCT from VCT, see this &lt;a href="http://blog.shandyba.com/2009/12/17/converting-variadic-template-arguments-pack-to-boost-mpl-sequence/"&gt;blog&lt;/a&gt;, which got me started on this. For the other way around, a solution is proposed below, but it only works for "true" variadic templates i.e. those that are supported in &lt;a href="http://www2.research.att.com/%7Ebs/C++0xFAQ.html#variadic-templates"&gt;C++x&lt;span class="number"&gt;&lt;span style="font-family:times new roman;"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="color:#990000;"&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt;&lt;span style="color:#663300;"&gt; ...&lt;/span&gt;Args&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;{};&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;as opposed to the old way, for example, with arity equals two:&lt;pre&gt;&lt;span style="color:#990000;"&gt;struct&lt;/span&gt; use_default&lt;b&gt;&lt;span style="color:#663300;"&gt;{};&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; T0&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; use_default&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; T1&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; use_default&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;{};&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Realizing that it's easy to get mixed up between class template and template class, template parameter and template arguments etc., to absolve myself from any mistake I defer to this very reliable &lt;a href="http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/topic/com.ibm.xlcpp8l.doc/language/ref/templates.htm#TEMPLATES"&gt;source&lt;/a&gt; on all matters pertaining to terminology about templates.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Let's invent some specializations:&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#990000;"&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; struct&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&amp;gt; {};&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; T&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; struct&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;T&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;{};&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; T&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; U&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; struct&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;T&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;U&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;{};&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;What are the requirements of our algorithm? As an input we have an MPL sequence, equivalently a pair of MPL iterators (the first and the last). The returned value will have to be &lt;code&gt;my_class&amp;lt;&amp;gt;&lt;/code&gt; instantiated with all the elements from the sequence.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;How do we implement it? It will involve a recursion incrementing the first iterator until it reaches the last.  At each iteration, the first of the remaining elements from the sequence is appended to the arguments already collected. Wait! You can only prepend &lt;code&gt;Args...&lt;/code&gt; (by the way, notice that the ellipsis is on the rhs of &lt;code&gt;Args&lt;/code&gt; because here it's an argument, not a parameter), therefore we will need reversed iterators. This translates into:&lt;/div&gt;&lt;pre&gt;&lt;span style="color:#990000;"&gt;namespace&lt;/span&gt; impl&lt;b&gt;&lt;span style="color:#663300;"&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; F&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; L&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; exit&lt;b&gt;&lt;span style="color:#663300;"&gt; :&lt;/span&gt;&lt;/b&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;equal_to&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typename&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;distance&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;F&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;L&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;   boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;int_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;0&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;br /&gt;&amp;gt;{};&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; F&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; L&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff6633;"&gt; bool&lt;/span&gt; exit&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; ...&lt;/span&gt;&lt;/b&gt;Args&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;deref&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;F&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type front_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;next&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;F&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type next_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; impl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;exit&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;next_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;L&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type exit_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;next_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;L&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;    exit_&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;value&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;front_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;Args&lt;b&gt;&lt;span style="color:#663300;"&gt;...&amp;gt;::&lt;/span&gt;&lt;/b&gt;type type&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; F&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; L&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; ...&lt;/span&gt;&lt;/b&gt;Args&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;F&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;L&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color:#000000;"&gt;true&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;Args&lt;b&gt;&lt;span style="color:#663300;"&gt;...&amp;gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;Args&lt;b&gt;&lt;span style="color:#663300;"&gt;...&amp;gt;&lt;/span&gt;&lt;/b&gt; type&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; Seq&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; seq_traits&lt;b&gt;&lt;span style="color:#663300;"&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;begin&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;Seq&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type first_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;end&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;Seq&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type last_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; impl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;exit&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;first_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;last_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type exit_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="color:#999999;"&gt;//impl&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;typename&lt;/span&gt; Seq&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;struct&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;reverse&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;    Seq&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;type reversed_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef typename&lt;/span&gt; impl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;      typename&lt;/span&gt; impl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;seq_traits&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;reversed_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;first_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;      typename&lt;/span&gt; impl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;seq_traits&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;reversed_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;last_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;      impl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;seq_traits&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;Seq&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;::&lt;/span&gt;&lt;/b&gt;exit_&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;value&lt;b&gt;&lt;span style="color:#663300;"&gt;&lt;br /&gt;   &amp;gt;::&lt;/span&gt;&lt;/b&gt;type type&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;Let's test it:&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#ff6633;"&gt;int&lt;/span&gt;&lt;span style="color:#990000;"&gt; main&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; (&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff6633;"&gt;int&lt;/span&gt; argc&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff6633;"&gt; char&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; *&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt; argv&lt;b&gt;&lt;span style="color:#663300;"&gt;[]) {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;int_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;0&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;  _0&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;   typedef&lt;/span&gt; boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;int_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;1&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;  _1&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;&lt;br /&gt;   {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;       typedef&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;br /&gt;        &lt;/b&gt;boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;vector&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&amp;gt; &amp;gt;::&lt;/span&gt;&lt;/b&gt;type found_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;       typedef&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/b&gt;  wanted_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;       BOOST_MPL_ASSERT&lt;b&gt;&lt;span style="color:#663300;"&gt;((&lt;/span&gt;&lt;/b&gt;boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;is_same&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;found_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;wanted_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;));&lt;br /&gt;   }&lt;br /&gt;   {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;       typedef&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;br /&gt;        &lt;/b&gt;boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;vector&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;_0&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt; &amp;gt;::&lt;/span&gt;&lt;/b&gt;type found_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;       typedef&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;_0&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt; wanted_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;       BOOST_MPL_ASSERT&lt;b&gt;&lt;span style="color:#663300;"&gt;((&lt;/span&gt;&lt;/b&gt;boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;is_same&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;found_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;wanted_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;));&lt;br /&gt;   }&lt;br /&gt;   {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;       typedef&lt;/span&gt; to_variadic&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;br /&gt;        &lt;/b&gt;boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;mpl&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;vector&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;_1&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;_0&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt; &amp;gt;::&lt;/span&gt;&lt;/b&gt;type found_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;       typedef&lt;/span&gt; my_class&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;_1&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;_0&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt; wanted_&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;       BOOST_MPL_ASSERT&lt;b&gt;&lt;span style="color:#663300;"&gt;((&lt;/span&gt;&lt;/b&gt;boost&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;is_same&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;found_&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;wanted_&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;gt;));&lt;br /&gt;   }&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt;   return&lt;/span&gt;&lt;span style="color:#999900;"&gt; 0&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Only a subset of the possible combinations are shown. That's not a trivial comment : my first test was partial and I had missed the reversed iterators part. In fact, I'm not claiming any more than the test shows as this stuff is still fresh.&lt;br /&gt;&lt;br /&gt;I used Ubuntu 9.10/GCC 4.4 with the additional gcc command &lt;code&gt;-std=c++0x&lt;/code&gt;. For completeness, here are the headers that have to be included:&lt;/div&gt;&lt;pre&gt;&lt;span style="color:#000099;"&gt;#include &amp;lt;boost/type_traits/is_same.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/assert.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/vector.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/equal_to.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/distance.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/int.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/deref.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/begin.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/end.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/mpl/reverse.hpp&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;Thanks for reading till the bitter end and see you, hopefully soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4897229266633089840-5626420022873634476?l=bx12.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bx12.blogspot.com/feeds/5626420022873634476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bx12.blogspot.com/2010/04/converting-mpl-sequence-to-variadic.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4897229266633089840/posts/default/5626420022873634476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4897229266633089840/posts/default/5626420022873634476'/><link rel='alternate' type='text/html' href='http://bx12.blogspot.com/2010/04/converting-mpl-sequence-to-variadic.html' title='Converting an MPL sequence to a variadic class template'/><author><name>BX12</name><uri>http://www.blogger.com/profile/10621772316425736125</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
