テンプレートに関する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または他の特定の型に直接置き換えないでください。これは退屈なので、型の抽出が必要です。