テンプレートに関するC++プログラミング言語学習ノート

1.テンプレート機能

1.1基本概念

テンプレートはコンパイル時にコードを生成し、その実行はマクロ置換ではなく、ルールの名前変更です

//传参后,模板函数编译时候如下,而不是将Type替换为int
typedef int Type;
void Swap<int>(Type& a,Type& b)
{
    
    
Type tmp=a;
a=b;
b=tmp;
}

そして、次のNは、定数を置き換えるマクロ置換です。
ここに画像の説明を挿入

1.2テンプレート関数のプッシュ例:

次の例で渡されるさまざまなパラメーターを使用して、コンパイル時にTが推定される理由を分析してみましょう。(注記は控除の結果を示しています)
例1:
ここに画像の説明を挿入
例2:
ここに画像の説明を挿入
例3:
ここに画像の説明を挿入
例4:
ここに画像の説明を挿入

1.3完全な一般化、部分的な特殊化、完全な特殊化を区別する

ここに画像の説明を挿入

1.4注意点:

①参照(&)の最下層はint * const(定数ポインタ)であるため、参照が渡された後、コンパイラはint *の後にconstを推定できず、コンパイルは失敗します。
ここに画像の説明を挿入
したがって、テンプレート関数でTの後にconstを手動で追加する必要があります
ここに画像の説明を挿入

②テンプレート関数もオーバーロードできます
ここに画像の説明を挿入

2.テンプレートクラス

2.1テンプレートクラスのコンパイルの控除ルール

クラス名にTの具象型を追加し、クラス
内でtypedefを使用して具象型の名前をTに変更します。
ここに画像の説明を挿入

2.2非型が存在する可能性があり、Nが異なる値の場合、オブジェクト型も異なります

たとえば、次のNはそれぞれ100と10です。置換後、2つの異なるペアがインスタンス化されます(メンバー属性が異なるため、それらは異なるオブジェクトであるため)。

ここに画像の説明を挿入

2.3クラステンプレートの関数のコンパイル

クラステンプレート内の関数が動員されている場合、クラステンプレート内の関数はコンパイルに参加し、動員されていない場合、コンパイルに参加しません。

したがって、以下はNの値を変更します。呼び出さない場合、エラーは検出されません。
ここに画像の説明を挿入

2.4テンプレートタイプのパラメータにデフォルト値を割り当てることができます

ここに画像の説明を挿入

2.5テンプレートタイプパラメータは複数持つことができます

ここに画像の説明を挿入

2.6テンプレートタイプはいつですか

Arrayiat、整数型が明示的に指定されているため、コンパイラは特定のコンテンツをインスタンス化し、これが特定の型になります

配列これはテンプレート型です。明示的な型が指定されていないため、コンパイラはどの型を処理するかを判断できません。

template<class T>
class Array
{
    
    
   enum{
    
    INIT=10};
   T* data;
   size_t capacity;
   size_t count;
};
int main()
{
    
    
    Array<int>iar;//这不是一个模板类型,因为编译器会把它实例化为下面的代码:
    /*
    class Array<int>
    {
       typedef int T;
       enum{INIT=10};
       T* data;
       size_t capacity;
       size_t count;
    };
    */
    Array//这是一个模板类型
}

2.7型抽出問題の紹介

Tはタイプです、

seqは、テンプレート型を受け取ることができる型であり、テンプレートパラメータが必要です。

main関数を使用している場合、次の状況が発生します。

Container <int、Array> container;

次に、これにより、テンプレートタイプではないArrayが特定のデザインタイプになるため、Container <int、Array>contatiner;のようになります。
ここに画像の説明を挿入

Tがint型として明確に識別できるように、抽出を型指定する方法は?

プログラム内のすべてのTをintまたは他の特定の型に直接置き換えないでください。これは退屈なので、型の抽出が必要です。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_54355780/article/details/122892330