L'utilisation d'une classe d'aide spécialisée est assez simple :
#include <type_traits>
#include <iostream>
template<typename T> class A {};
template<typename T>
struct is_a : std::false_type {};
template<typename T>
struct is_a<A<T>> : std::true_type {};
int main()
{
auto a1=A<int>{};
bool b1=false;
std::cout << is_a<decltype(a1)>::value << std::endl;
std::cout << is_a<decltype(b1)>::value << std::endl;
return 0;
}
is_a
est spécialisé pour un paramètre de modèle qui est une instance de A
. La version non spécialisée est le faux trait, et la version spécialisée est le vrai trait, et c'est à peu près tout. Si vous n'êtes pas familier avec le sujet de la spécialisation des modèles, il s'agit d'un sujet assez complexe et profond qui devrait avoir une explication complète dans tout bon manuel C++, et je vous y renvoie pour une discussion complète sur ce sujet.