2017-05-17 12 views
8

class = voidの目的は次のコードスニペットにありますか?C++でのclass = voidの目的は?

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

これはパラメータ – user463035818

+0

のデフォルトですが、 'class = void'がなくても動作しますか? –

+0

この特定の例では、 'has_type_member'を[sfinae]にします(http://stackoverflow.com/documentation/c%2b%2b/1169/sfinae-substitution-failure-is-not-an-error/3780/何がsfinae#t = 201705171252153703043) - フレンドリー。 –

答えて

10
template< class, class = void > 
struct has_type_member : false_type { }; 
デフォルトの構造体のテンプレートをだ

、それは2つのテンプレート引数を要求しますが、二つ目は、デフォルトとしてvoidに設定されているので、この引数はややデフォルトの関数パラメータと同様に、明示的に指定する必要はありません。 。その後

template< class T > 
struct has_type_member<T, void_t<typename T::type>> : true_type { }; 

T::typeが存在する(したがって、無効な構文です)していない場合SFINAEは、この専門分野を除外します、あなたのhas_type_member構造体のテンプレートの特殊化されており、それが存在しない場合、それが選択されますそうでなければこの専門化。

2番目のパラメータはテンプレートの特殊化に使用する必要がありますが、「代替」のstructでは使用しないため、デフォルトはvoidです。

+0

厳密に言えば、 'class = std :: void_t <>'を使って何が起きているのかを知ることができます。 – StoryTeller