title: Void type in std::tuple
body: <p>Obviously, you can't have an instance of type <code>void</code> in a well-formed program, so something like the following declaration won't compile:</p>
  
  <pre><code>std::tuple&lt;void, double, int&gt; tup;
  </code></pre>
  
  <p>However, as long as we're dealing strictly with types as opposed to objects, there seems to be no issue.  For example, my compiler (GCC) lets me say:</p>
  
  <pre><code>typedef std::tuple&lt;void, double, int&gt; tuple_type;
  </code></pre>
  
  <p>This is interesting to me, because it seems that with C++0x we can just use <code>std::tuple</code> to perform a lot of the meta-programming tricks that earlier would have required the <code>boost::mpl</code> library.  For example, we can use <code>std::tuple</code> to create a vector of types.</p>
  
  <p>For example, suppose we want to create a vector of types representing a function signature:</p>
  
  <p>We can just say:</p>
  
  <pre><code>template &lt;class R, class... Args&gt;
  struct get_function_signature;
  
  template &lt;class R, class... Args&gt;
  struct get_function_signature&lt;R(*)(Args...)&gt;
  {
      typedef std::tuple&lt;R, Args...&gt; type;
  };
  </code></pre>
  
  <p>This seems to work, even if the function signature has a <code>void</code> type, as long as we never actually instantiate an instance of <code>get_function_signature&lt;F&gt;::type</code>.  </p>
  
  <p>However, C++0x is still new to me, and of course all implementations are still somewhat experimental, so I'm a bit uneasy about this.  Can we really use <code>std::tuple</code> as a vector of types for meta-programming?</p>