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 { };
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 { };
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
です。
厳密に言えば、 'class = std :: void_t <>'を使って何が起きているのかを知ることができます。 – StoryTeller
これはパラメータ – user463035818
のデフォルトですが、 'class = void'がなくても動作しますか? –
この特定の例では、 'has_type_member'を[sfinae]にします(http://stackoverflow.com/documentation/c%2b%2b/1169/sfinae-substitution-failure-is-not-an-error/3780/何がsfinae#t = 201705171252153703043) - フレンドリー。 –