c+++のテンプレートの特化

1901 ワード

テンプレートの特化について
c+++関数のテンプレートについて
関数の特化
テンプレートを使用すると特殊なタイプに遭遇します.直接に現在のテンプレート関数を使用することはできません.だから、このタイプに対してテンプレート関数を特化する必要があります.
等しいと判断するテンプレート関数を使うと
template
bool Isequal(T& p1, T& p2){
	return p1 == p2;
}

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