4

C++ 標準の第 14 章 (テンプレート) では、コンテキストに応じていくつかの異なる名前を持つテンプレート パラメーターを参照します。

非型パラメータ

 template<int N>
 class foo {};

テンプレート パラメータ

template<typename T>
class bar {};

型パラメータ

 ?????

以下のこの引用では、これらが 3 つの異なるものであるように見えますが、型パラメーターとは何かわかりません。

14.1 テンプレートパラメータ [temp.param]

9 ... デフォルトのテンプレート引数は、テンプレート パラメーター パック (14.5.3) ではない任意の種類のテンプレート パラメーター(型、非型、テンプレート)に対して指定できます。...

ここでは、テンプレート パラメーターに 3 つの異なる名前があることがわかります。template-parameterが他の 2 つの一般化である場合、なぜそれを上記のリストに含めたのでしょうか。

セクション 14.1.2 では、それらを単にtypeおよびnon-typeとして参照し、テンプレート パラメータを一般化として参照しています。

それで、それは何ですか?誰か説明できますか?

4

2 に答える 2

7

template-parameterには 3 つのタイプがあると言っています。

  1. 型テンプレート パラメータ

    template<typename T>
    class bar {};
    
  2. 非型テンプレート パラメータ

    template<int N>
    class foo {};
    
  3. テンプレート テンプレート パラメータ

    template<template<class> class T>
    class baz {};
    

ただし、これが正しく定義されていないことに同意します。文法では、で始まるtemplate-parameterは、 type-parametertemplateの可能な生成の 1 つです。

于 2013-03-12T18:49:58.123 に答える
5

この表現を使用しているコンテキストでは、「テンプレート パラメーター」はクラス テンプレートであるパラメーターです。例えば:

template<template<typename, typename> class T, typename U, int N>
struct { ... };

ここで、Tテンプレート パラメータU型パラメータNは非型パラメータです。

セクション 14.1.2 では、それらを単に型と非型として参照し、テンプレート パラメータを一般化として参照します。

ここで、「テンプレート」という言葉の使用を明確にすることが重要です。多くのコンテキストでは、それらが「テンプレートの」パラメーターであることを示すためにのみ使用されます (たとえば、関数のパラメーターとは対照的に)。その場合、これらのカテゴリは (それぞれ) 「テンプレート テンプレート パラメータ」、「テンプレート タイプ パラメータ」、および「テンプレート 非タイプ パラメータ」になります。

また、場合によっては、最初のカテゴリも「非型パラメータ」を定義すると見なされます。これは、最初のカテゴリに指定できる引数がではない(テンプレートである) ためです。したがって、「非型、非テンプレート パラメータ」という表現は、厳密に 3 番目のカテゴリ (つまり、N上記のカテゴリ) を指す場合があります。

C++11 標準の段落 14.1/2 の脚注 136 も参照してください。

テンプレート template-parameterstemplate template-argumentsは説明目的で型として扱われるため、非型パラメーターと非型引数という用語はで非テンプレートのパラメーターと引数を指すために使用されます。

于 2013-03-12T18:50:13.253 に答える