c++ - can't make a string literal type -


i'd make string literal can use template argument. throws compiler kind of endless loop. problem , fix?

template <char...> struct slit { };  template <typename ...a> constexpr auto make_slit(char const* const s, const ...args) {   return *s ? make_slit(s + 1, *s, args...) : slit<args...>(); }  int main() {   auto const tmp_(make_slit("slit"));    return 0; } 

the obligatory error (with clang++ -std=c++1y):

t.cpp:4:16: fatal error: recursive template instantiation exceeded maximum depth of 256 constexpr auto make_slit(char const* const s, const ...args)                ^ t.cpp:6:15: note: in instantiation of function template specialization 'make_slit<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>' requested here   return *s ? make_slit(s + 1, *s, args...) : slit<args...>(); 

putting aside looping instantiation, cannot achieve want function parameter cannot used constant expression, required of template arguments. meaning following not allowed either:

template <typename... a> constexpr auto make_slit(a const... args) {   return slit<args...>(); }  // error make_slit('a'); 

if find surprising, keep in mind constexpr functions feature allow functions also usable in constant expression. yours isn’t in general however:

char c; std::cin >> c; // result type? make_slit(c); 

i should note during design of literal string operators suggested function template form allowed (much integer , floating-point literals), achieve need:

// allowed... template<char... cs> constexpr slit<cs...> operator"" _slit() { return {}; }  // ...but auto constexpr s = 123_slit; auto constexpr t = 12.3_slit;  // ... , not auto constexpr u = "abc"_slit; 

this missing functionality brought in 2013 richard smith’s n3599: literal operator templates strings. unfortunately don’t know current status of feature is.


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -