クラス内でのテンプレートの特殊化の可能性

ヤドカリ

次のようなコードに遭遇しました。

class XX
{
public:
    template<typename TT> struct YY;

    template<typename TT, typename UU> struct YY<std::pair<TT, UU>>
    {
        std::size_t operator()(std::pair<TT, UU> const& val) const
        {
            // content omitted for brevity
        }
    };
};

基本的に、私は混乱していて、このコードを理解するのに助けが必要です。

具体的には、最初のYY宣言は前方宣言ですか?2番目のYY宣言は、部分的なテンプレートの特殊化ですか?2番目のYY宣言に2つのテンプレート引数(TTとUU)があるのに、最初のYY宣言には1つのテンプレート引数(TT)しかないのはなぜですか?最初のYY宣言に定義がないのはなぜですか?

(コードは問題なくコンパイルされます。)

ジョドカス

具体的には、最初のYY宣言は前方宣言ですか?

はい。これによりYY<T>、...を除くすべてのインスタンス化が不完全な型になります。

2番目のYY宣言は、部分的なテンプレートの特殊化ですか?

...完全な定義を提供する特定のタイプまたはタイプのクラス(ポインターなど)に特化したテンプレートがある場合。この特定のケースでは、これはすべてのために適用すること、実際に部分的な特殊であるYY<T>TとのペアタイプであるTTUU

2番目のYY宣言に2つのテンプレート引数(TTとUU)があるのに、最初のYY宣言には1つのテンプレート引数(TT)しかないのはなぜですか?

コードの作成者は、ペアのタイプに条件を課したくありませんでした。それらは任意です。このような特殊YY化を作成するstd::pairことにより、基本的に、を2つの引数を持つテンプレートとして使用するすべてのインスタンス化を促進します

最初のYY宣言に定義がないのはなぜですか?

必要ないかもしれないので。スペシャライゼーションを作成するために必要なのは宣言だけです。実際にYYそこで定義した場合、特殊化が適切でない場合に常にインスタンス化される「デフォルト」のインスタンス化を取得しているはずです。あなたがいる場合したいコンパイルが失敗するあなたは何の専門がないタイプを選択した場合、あなたはそのようにそれを行うことができます。あるいは(そしておそらくより良い)、実際には、static_assert(!std::is_same_v<T, T>)「不完全なタイプのオブジェクトを作成できません」などよりも意味のあるメッセージとともにまたはそのようなものを含むテンプレートを定義します

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラステンプレートの部分的特殊化の同等性

分類Dev

クラスエラー内のC ++テンプレートの特殊化

分類Dev

内部クラスのテンプレートの特殊化

分類Dev

クラスと関数テンプレートの特殊化

分類Dev

C ++クラステンプレートの特殊化

分類Dev

テンプレートクラスの部分特殊化構文

分類Dev

テンプレートコンストラクタでのテンプレートクラスの特殊化

分類Dev

テンプレートクラスでの名前空間の特殊化

分類Dev

クラステンプレートの特殊化で「期待される '>'」?

分類Dev

テンプレート特殊化内での typedef の使用

分類Dev

テンプレートクラスでのテンプレートメンバー関数の特殊化

分類Dev

テンプレートクラスでのテンプレートメンバーの特殊化

分類Dev

複数のタイプのクラステンプレートの特殊化

分類Dev

フレンドクラスの部分的なテンプレートの特殊化?

分類Dev

クラスでのメンバークラステンプレートの特殊化の使用

分類Dev

クラステンプレートのメンバー関数の特殊化

分類Dev

1つの関数のクラステンプレートの特殊化

分類Dev

別のクラスのテンプレート演算子の特殊化

分類Dev

テンプレート化されたクラス内のメソッドの完全な特殊化

分類Dev

クラスメンバーテンプレートの特殊化(およびクラステンプレートメンバーの特殊化)に異なるアクセス修飾子を設定することは可能ですか?

分類Dev

C ++コンストラクターテンプレートの特殊化

分類Dev

別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

分類Dev

Eigen3クラスのテンプレートの特殊化

分類Dev

テンプレートクラス-メンバー関数の特殊化

分類Dev

派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

分類Dev

テンプレート<クラスT>の特殊化テンプレート<クラスT>の定義

分類Dev

テンプレートクラステンプレートコンストラクタの特殊化

分類Dev

派生クラスによるc ++テンプレートの特殊化

分類Dev

SFINAEおよび部分クラステンプレートの特殊化

Related 関連記事

  1. 1

    クラステンプレートの部分的特殊化の同等性

  2. 2

    クラスエラー内のC ++テンプレートの特殊化

  3. 3

    内部クラスのテンプレートの特殊化

  4. 4

    クラスと関数テンプレートの特殊化

  5. 5

    C ++クラステンプレートの特殊化

  6. 6

    テンプレートクラスの部分特殊化構文

  7. 7

    テンプレートコンストラクタでのテンプレートクラスの特殊化

  8. 8

    テンプレートクラスでの名前空間の特殊化

  9. 9

    クラステンプレートの特殊化で「期待される '>'」?

  10. 10

    テンプレート特殊化内での typedef の使用

  11. 11

    テンプレートクラスでのテンプレートメンバー関数の特殊化

  12. 12

    テンプレートクラスでのテンプレートメンバーの特殊化

  13. 13

    複数のタイプのクラステンプレートの特殊化

  14. 14

    フレンドクラスの部分的なテンプレートの特殊化?

  15. 15

    クラスでのメンバークラステンプレートの特殊化の使用

  16. 16

    クラステンプレートのメンバー関数の特殊化

  17. 17

    1つの関数のクラステンプレートの特殊化

  18. 18

    別のクラスのテンプレート演算子の特殊化

  19. 19

    テンプレート化されたクラス内のメソッドの完全な特殊化

  20. 20

    クラスメンバーテンプレートの特殊化(およびクラステンプレートメンバーの特殊化)に異なるアクセス修飾子を設定することは可能ですか?

  21. 21

    C ++コンストラクターテンプレートの特殊化

  22. 22

    別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

  23. 23

    Eigen3クラスのテンプレートの特殊化

  24. 24

    テンプレートクラス-メンバー関数の特殊化

  25. 25

    派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

  26. 26

    テンプレート<クラスT>の特殊化テンプレート<クラスT>の定義

  27. 27

    テンプレートクラステンプレートコンストラクタの特殊化

  28. 28

    派生クラスによるc ++テンプレートの特殊化

  29. 29

    SFINAEおよび部分クラステンプレートの特殊化

ホットタグ

アーカイブ