2017-05-17 1 views
8

Quel est l'objectif de class = void dans les extraits de code suivants?But de la classe = void en C++?

template< class, class = void > 
struct has_type_member : false_type { }; 
template< class T > 
struct has_type_member<T, void_t<typename T::type>> : true_type { }; 
+5

c'est un défaut pour le paramètre – user463035818

+0

cela fonctionnera même sans 'class = void', non? –

+0

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. –

Répondre

10
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.

+0

Strictement parlant, on pourrait faire 'class = std :: void_t <>' pour faire allusion à ce qui se passe. – StoryTeller