title: How to apply template template parameters in case of variadic template
body: <p>I'm working on template <code>MyTemplate</code> that is going to be used in following way:</p>
  
  <pre><code>using Alias = MyTemplate&lt;std::pair&lt;int, char&gt;,
                           std::pair&lt;int, double&gt;,
                           std::pair&lt;int, unsigned int&gt;&gt;;
  </code></pre>
  
  <p>For now we can assume that <code>MyTemplate</code> will take only list of pair types. Moreover, all pair types should have the same first type and second type have to vary.</p>
  
  <p>I want to "catch" the pairs' <code>first_type</code> in <code>MyTemplate</code>. I came up with following definition:</p>
  
  <pre><code>template&lt;typename... Ts&gt;
  struct MyTemplate
  {
     using first_type = std::decay_t&lt;decltype((Ts::first_type, ...))&gt;;
     // ...
  };
  </code></pre>
  
  <p>When I use <code>typename MyTemplate::first_type</code> in context of different template everything works fine. I only get a warning:</p>
  
  <pre><code>warning: left operand of comma operator has no effect [-Wunused-value]
      using first_type = std::decay_t&lt;decltype((Ts::first_type, ...))&gt;;
                                                                      ^
  </code></pre>
  
  <p>However, I cannot create instance of <code>Alias</code> because I get that error:</p>
  
  <pre><code>error: missing 'typename' prior to dependent type name 'std::pair&lt;int, char&gt;::first_type'
  </code></pre>
  
  <p>Do you gave any idea for "generic" solution? I can use C+17.</p>