title: Using a template alias instead of a template within a template
body: <p>From a previous question:</p>
  
  <p><a href="https://stackoverflow.com/questions/17390605/doing-a-static-assert-that-a-template-type-is-another-template">Doing a static_assert that a template type is another template</a></p>
  
  <p>Andy Prowl provided me with this code that allows me to <code>static_assert</code> that a template type is another template type:</p>
  
  <pre><code>template&lt;template&lt;typename...&gt; class TT, typename... Ts&gt;
  struct is_instantiation_of : public std::false_type { };
  
  template&lt;template&lt;typename...&gt; class TT, typename... Ts&gt;
  struct is_instantiation_of&lt;TT, TT&lt;Ts...&gt;&gt; : public std::true_type { };
  
  template&lt;typename T&gt;
  struct foo {};
  
  template&lt;typename FooType&gt;
  struct bar {
    static_assert(is_instantiation_of&lt;foo,FooType&gt;::value, ""); //success
  };
  
  int main(int,char**)
  {
    bar&lt;foo&lt;int&gt;&gt; b; //success
    return 0;
  }
  </code></pre>
  
  <p>This works great.</p>
  
  <p>But if I change the code like this to use an alias of <code>foo</code>, things go bad:</p>
  
  <pre><code>template&lt;template&lt;typename...&gt; class TT, typename... Ts&gt;
  struct is_instantiation_of : public std::false_type { };
  
  template&lt;template&lt;typename...&gt; class TT, typename... Ts&gt;
  struct is_instantiation_of&lt;TT, TT&lt;Ts...&gt;&gt; : public std::true_type { };
  
  template&lt;typename T&gt;
  struct foo {};
  
  //Added: alias for foo
  template&lt;typename T&gt;
  using foo_alt = foo&lt;T&gt;;
  
  template&lt;typename FooType&gt;
  struct bar {
    //Changed: want to use foo_alt instead of foo here
    static_assert(is_instantiation_of&lt;foo_alt,FooType&gt;::value, ""); //fail
  };
  
  int main(int,char**) {
    //both of these fail:
    bar&lt;foo&lt;int&gt;&gt; b;
    bar&lt;foo_alt&lt;int&gt;&gt; b2;
  
    return 0;
  }
  </code></pre>
  
  <p>Can this be solved?</p>