Jest rzeczywiście bardzo elegancki sposób na zakończenie rekurencji:
template <typename Last>
std::string type_name() {
return std::string(typeid(Last).name());
}
template <typename First, typename Second, typename ...Rest>
std::string type_name() {
return std::string(typeid(First).name()) + " " + type_name<Second, Rest...>();
}
Początkowo wypróbowałem template <typename Last>
i template <typename First, typename ...Rest>
, ale uznano to za niejednoznaczne (można odpocząć zero elementów). To pytanie następnie pokazał mi ostateczne rozwiązanie: Compilation Error on Recursive Variadic Template Function
Uwaga, aby uniknąć kawałek kodu powielania, można również zrobić:
template <typename Last>
std::string type_name() {
return std::string(typeid(Last).name());
}
template <typename First, typename Second, typename ...Rest>
std::string type_name() {
return type_name<First>() + " " + type_name<Second, Rest...>();
}
Link, który cytujesz, jest martwy. Czy potrafisz opracować poprawny sposób, aby to zrobić bez błędnego g ++? – cdhowie
To obejście jest również konieczne w przypadku Clang na komputerze Mac. – Gerard
Chociaż ta odpowiedź jest prawidłowa, jest nieaktualna. Możliwe jest prostsze podejście, zobacz inne odpowiedzi. – Johannes