È necessario utilizzare la specializzazione parziale per terminare la ricorsione, ma poiché non è possibile specializzare parzialmente le funzioni libere in C++, è necessario creare una classe di implementazione con una funzione membro statica.
template <typename... Args>
struct Impl;
template <typename First, typename... Args>
struct Impl<First, Args...>
{
static std::string name()
{
return std::string(typeid(First).name()) + " " + Impl<Args...>::name();
}
};
template <>
struct Impl<>
{
static std::string name()
{
return "";
}
};
template <typename... Args>
std::string type_name()
{
return Impl<Args...>::name();
}
int main()
{
std::cout << type_name<int, bool, char, double>() << std::endl; // "i b c d"
return 0;
}
Quella prima dichiarazione di Impl
è solo a workaround for a shortcoming in g++ 4.6 (e sotto). Non sarà necessario una volta implementato correttamente i modelli variadici.
Check it out in action at ideone.com
fonte
2011-08-19 22:19:57
Il collegamento temporaneo che citi è morto. Puoi elaborare il modo corretto per farlo senza un g ++ bacato? – cdhowie
Questa soluzione alternativa è necessaria anche per Clang su Mac – Gerard
Sebbene questa risposta sia corretta, non è aggiornata. È possibile un approccio più semplice, vedere altre risposte. – Johannes