title: can't make a string literal type
body: <p>I'd like to make a string literal I can use as a template argument. It throws the compiler into some kind of endless loop. What is the problem and fix?</p>
  <pre><code>template &lt;char...&gt; struct slit { };
  
  template &lt;typename ...A&gt;
  constexpr auto make_slit(char const* const s, A const ...args)
  {
    return *s ? make_slit(s + 1, *s, args...) : slit&lt;args...&gt;();
  }
  
  int main()
  {
    auto const tmp_(make_slit(&quot;slit&quot;));
  
    return 0;
  }
  </code></pre>
  <p>The obligatory error (with <code>clang++ -std=c++1y</code>):</p>
  <pre><code>t.cpp:4:16: fatal error: recursive template instantiation exceeded maximum depth of 256
  constexpr auto make_slit(char const* const s, A const ...args)
                 ^
  t.cpp:6:15: note: in instantiation of function template specialization 'make_slit&lt;char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
        char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char&gt;' requested here
    return *s ? make_slit(s + 1, *s, args...) : slit&lt;args...&gt;();
  </code></pre>
  <p>EDIT: check out <a href="https://stackoverflow.com/questions/15858141/conveniently-declaring-compile-time-strings-in-c/15863826#15863826">this</a> answer, generating compile time slit types is possible.</p>