c+++のテンプレートの特化
1901 ワード
テンプレートの特化について
c+++関数のテンプレートについて
関数の特化
テンプレートを使用すると特殊なタイプに遭遇します.直接に現在のテンプレート関数を使用することはできません.だから、このタイプに対してテンプレート関数を特化する必要があります.
等しいと判断するテンプレート関数を使うとテンプレートを用いて特化するには、基礎となるテンプレート関数(すなわち、上記の最初のテンプレート関数) が必要である.特別なテンプレート関数を使用する場合、フォーマットには要求があります.1.templateの後、直接にタイプ2を書かないでください.関数名(特化タイプパラメータ1、特化タイプパラメータ2、...)は、関数名の後に<>に特化するタイプ を書きます.特化された関数の関数名は、パラメータリストは元の基礎となるテンプレート関数と同じであり、不必要なエラーを回避するために必要である.
実際の使用では、簡単にするために、いくつかのテンプレート関数の処理に問題がある特殊なタイプについて、直接に書きます. 直接マッチングできる関数がある場合、特化された関数があっても、直接マッチングの関数 を優先的に使用する.
クラスのテンプレート特化
クラスのテンプレートの特化は二つに分けられます.一つは全特化で、一つは偏り特化です.フル特化:すべてのテンプレートタイプを特化する .偏特化:テンプレートの種類に対していくつかの制限を行う 偏愛特化部は、2つの部分特化であり、1つはテンプレートタイプに対するさらなる制限 である.部分特化:関数テンプレートの一部のみを特化することである .タイプの範囲に対する制限、主要タイプの基礎は不変です.
c+++関数のテンプレートについて
関数の特化
テンプレートを使用すると特殊なタイプに遭遇します.直接に現在のテンプレート関数を使用することはできません.だから、このタイプに対してテンプレート関数を特化する必要があります.
等しいと判断するテンプレート関数を使うと
template
bool Isequal(T& p1, T& p2){
return p1 == p2;
}
しかし、このテンプレート関数は文字列を比較する時には使えなくなります.文字列については直接比較できません.したがって、文字列用のテンプレートパラメータを直接特化しました.template<> // ,
bool Isequal(char*& p1, char*& p2){
return strcmp(p1, p2) == 0;
}
【注意】実際の使用では、簡単にするために、いくつかのテンプレート関数の処理に問題がある特殊なタイプについて、直接に書きます.
bool Isequal(char*& p1, char*& p2){
cout << "char2" << endl;
return strcmp(p1, p2) == 0;
}
クラスのテンプレート特化
クラスのテンプレートの特化は二つに分けられます.一つは全特化で、一つは偏り特化です.
template
class Test{
}
//
template <> //
class Test{
}
template
class Test2{
}
//
template // ,
class Test2{
}
template
class Test2{
}
//
template //
class Test2{
}
呼び出し時には、自分のタイプに最適な呼び出しを行います.