Utilisez is_same
:
#include <type_traits>
template <typename T>
void foo()
{
if (std::is_same<T, animal>::value) { /* ... */ } // optimizable...
}
Habituellement, c'est une conception totalement irréalisable, cependant, et vous voulez vraiment vous spécialiser :
template <typename T> void foo() { /* generic implementation */ }
template <> void foo<animal>() { /* specific for T = animal */ }
Notez également qu'il est inhabituel d'avoir des modèles de fonctions avec des arguments explicites (non déduits). Ce n'est pas rare, mais il existe souvent de meilleures approches.