1

次の方法でテンプレートを使用してデータ構造を作成できることを学びました。

template<typename T>
struct X {
   T weight;
   int age;
};

関数は、次の方法でテンプレートを使用することもできます。

template <class T>
T func_name(int age, T human) {
    something_here;
}

違いの 1 つは、最初のケースでは s を使用typenameし、2 番目のケースでは を使用することclassです。

以下を含むコードを見つけました。

template<typename S, typename T>
bool is_null(const row<T>& r)

したがって、私が理解できないのは、関数と組み合わせて使用​​するtypename(および使用しない) 理由です。class使うべきではありませんclassか?

4

4 に答える 4

3

typenameこのコンテキストでは、キーワードとキーワードの間に技術的な違いはありませんclass。それは単にスタイルの問題です。template<class T> struct X最初の 2 つのコード例の意味は、とで始まっていても 1 ビットも変わりませんtemplate <typename T> T func_name(int age, T human)class(私は、テンプレート パラメータが のようなものではなく、クラスである必要があることを意味するときに使用する傾向がありますint。)

于 2013-03-11T16:00:15.020 に答える
0

それらが異なる点は1つだけであり(テンプレートパラメーターを宣言する場合)、それはtemplate-templatesを使用する場合です。

以下は明確に定義されたC++です

template <template <typename> class TT> struct example_one {};

これはそうではありませんが:

template <template <typename> typename TT> struct example_two {};

C ++ / templateを始めたばかりのように見えるので、このコーナーケースはしばらくは関係ありません:-)上記を除いて、クラステンプレート、関数テンプレート、それは重要ではありません:typenameとclassは同義語。

于 2013-03-11T17:52:17.420 に答える
0

が最初に導入されたとき、「これはテンプレート引数です」というインジケータとしてtemplate既存のキーワードのみが許可されていました。classテンプレート引数が実際にはクラス (関数ポインター、整数型、またはその他の「クラスではない」型) ではない場合、これはかなり馬鹿げたものになるため、がと同様に許可されるtypenameことをより明確にするために が導入されました。template<typename T> struct something { T x; };something<int> a;something<name_of_class> a;

すべての意図と目的のために、classテンプレートtypenameパラメーターの場合は交換可能であり、選択するスタイルの問題です [ほとんどの人は、2 つを混在させるのではなく、1 つに固執することをおそらく好むでしょうclass。タイプはクラスであるtypename必要があり、「任意の」タイプにすることができる場合]。

于 2013-03-11T16:23:10.607 に答える
0

テンプレート パラメータ定義のコンテキストでは、キーワードtypenameとキーワードclassは同義です。

ほぼすべての人が、固執する傾向がある規則を持っています。個人的には、常にclassここで使用typenameし、他の用途のためにキーワードを予約することを好みます。

のもう 1つの用途typenameは、テンプレートの定義または宣言で依存型を明確にすることです。

ウィキペディアの例を次に示します。

template <typename T>
void foo(const T& t)
{
   // declares a pointer to an object of type T::bar
   T::bar * p;
}

struct StructWithBarAsType {
   typedef int bar;
};

int main() {
   StructWithBarAsType x;
   foo(x);
}

よく見るとT::bar * p;、 ,は、テンプレートのインスタンス化に使用される型のコンテキストに応じて型または値のいずれかになる可能性があるため、コンパイラーにとってあいまいなbarテンプレートパラメーターに依存していることに気付くでしょう。デフォルトでは値として扱われるため、意味は乗算することになり、これは私たちが望むものではありません.TbarTbarT::barp

解決策は、依存型をtypenameキーワードで修飾することです。

typename T::bar * p;

barこれは、型として扱うつもりであるという事実をコンパイラに警告します。

于 2013-03-11T16:23:39.727 に答える