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
Post a Comment