template< class, class = void >
struct has_type_member : false_type { };
C'est votre modèle struct par défaut, il demande 2 arguments de modèle, mais le second est réglé sur void
par défaut, donc cet argument n'a pas besoin d'être explicitement spécifié, un peu comme un paramètre de fonction par défaut .
Puis:
template< class T >
struct has_type_member<T, void_t<typename T::type>> : true_type { };
est une spécialisation de modèle pour votre struct has_type_member
, SFINAE écarteront cette spécialisation si T::type
n'existe pas (et donc, est une syntaxe non valide), si elle existe, il choisira cette spécialisation autrement.
Le 2ème paramètre doit être utilisé pour la spécialisation du template, mais nous ne l'utilisons pas dans notre "fallback" struct
donc nous avons juste par défaut void
.
c'est un défaut pour le paramètre – user463035818
cela fonctionnera même sans 'class = void', non? –
Dans cet exemple particulier, il a laissé 'has_type_member' être [sfinae] (http://stackoverflow.com/documentation/c%2b%2b/1169/sfinae-substitution-failure-is-not-an-error/3780/ quoi-est-sfinae # t = 201705171252153703043) -friendly. –