2017-11-13 15 views
0

以下のクラステンプレートの特殊化では、整数タイプのテンプレート引数を使用する場合、s1のインスタンス化のみが可能です。継承によるSFINAEクラス

template <typename, typename = void> 
    struct s1; 

template <typename T> 
struct s1<T, std::enable_if_t<std::is_integral<T>::value>> { }; 

次のクラステンプレートs2は類似しています。条件付きでは簡単な基底クラスから個人的に継承しますが。 s1s2の機能の違いは何ですか? s1

struct Base { }; 

template <typename T> 
struct s2 : private std::enable_if_t<std::is_integral<T>::value,Base> { }; 
+0

'T 'が整数でない場合、' s2'はどのようなものから派生すると思いますか? – AndyG

+0

s2をBaseからプライベートに派生させる場合、私はすべての目的と目的が同等であると考えます。 –

+0

@RichardHodgesが提案するように、私はs2を更新して私的に継承しました。 – user2023370

答えて

2

あなたは、コードの分散型ビットでより多くのケースをカバーする新しい専門でそれを拡張することができます。 SFINAEは唯一の専門化が有効である限り、開始され、選択されます。

このような特殊化でテストされた表現は任意です。

Tが浮動小数点型、複合型、または配列の場合に受け入れるs1特殊化を作成できます。

s2の場合、テンプレートパターンの一致がベアのパターンよりも好都合である可能性があるのは、Tを使用してさらに一致する特殊化を作成できます。たとえば浮動小数点型を受け入れるs2特殊化を作成する方法はありませんが、どのポインタも受け入れることができます。

+0

ありがとうございます。私が興味を持っているのは、ペア間の機能の違いです。 – user2023370

+0

@userはテンプレートではないので何もしません。まあ、コンパイルにどれくらいの時間がかかるかを測定できると思います。彼らは、私が答えようとしているものである、それらを使うことができる他のコードに関して異なって行動します。また、それらを使用できる他のコードに関しても同じように動作します。あなたが気にしているように "そのまま"という意味で使用するという特定の*種類の使用制限がある場合は、明示的に役立ちます。私は、テンプレートの引数のカウントとしてそれらを渡すのですか? – Yakk

+0

公正なポイント。はい、テンプレートテンプレートの引数がカウントされます。私は、 's1'だけがこれに関連する2つのテンプレート引数をとることができると考えています(機能の明確な違い)。たとえば、 's1 'となります。答えてくれてありがとう。 – user2023370