七、関数テンプレート


関数テンプレート
一、汎用型プログラム設計
汎用プログラム設計とは、アルゴリズムが実装される際に具体的に操作するデータのタイプを指定しないことを指す.そのためアルゴリズムは一度に実現すれば多種のデータ構造に応用でき、重複コードの作成を大量に減らすことができ、汎用プログラム設計を実現する重点は関数テンプレート、クラステンプレートを大量に使用することである.
二、問題の提出
2つのint変数の値を交換するには、次のようなSwap関数を記述する必要があります.
void Swap(int & x, int & y){
    int tmp = x;
    x = y;
    y = tmp;
}

2つのdouble型変数の値を交換するには、次のようなSwap関数を記述する必要があります.
void Swap(double & x, double & y){
    double tmp = x;
    x = y;
    y = tmp;
}

質問:Swapを1つだけ書いて、いろいろなタイプの変数を交換できますか?
解決方法:関数テンプレートを使用します.
関数テンプレートの形式は次のとおりです.
template戻り値タイプテンプレート名(パラメータテーブル){関数体}
三、プログラムの実例
template <class T, class T1>
void Swap(T & x, T & y)
{
    T temp = x;
    x = y;
    y = temp;
}

template <class T, class T1>
void Swap(T & x, T1 & y)
{
    cout<<y<<" "<<x<<endl;
}

int main()
{
    int a=1, b=2;
    Swap(a, b); //        void Swap(int &, int &)  
    cout<<a<<" "<<b<<endl;

    double c=3.3, d=4.4;
    Swap(c, d); //        void Swap(double &, double &)  
    cout<<c<<" "<<d<<endl;

    int e=5;
    double f=4.4;
    Swap(e, f); //        void Swap(int &, double &)  

    return 0;
}

四、注意事項
4.1非タイプパラメータ
非タイプパラメータは、関数テンプレートに存在します.
template <class T>
T MaxElement(T a[], int size) //size       

4.2重荷重
関数テンプレートは、上記の2つのswap関数など、パラメータテーブルが異なる限り再ロードできます.
4.3優先順位
C++コンパイラは、Step 1:パラメータが完全に一致する通常の関数(テンプレートがインスタンス化されていない関数)Step 2:パラメータが完全に一致するテンプレート関数を探すStep 3:パラメータが自動タイプ変換されて一致する通常の関数を探すStep 4:上のものが見つからない場合、エラーを報告する
4.4二義性
注意:関数テンプレートのタイプパラメータの二義性を回避します.
template<class T>
T myFunction(T arg1, T arg2) { }
myFunction(5, 8.4); //error: replace T with int or double? 

五、まとめ
キーコードは次のとおりです.
template <class T, class T1>
void func(T & x, T & y)

関数のパラメータテーブルには複数のタイプパラメータがあり、非タイプパラメータがあり、タイプパラメータは戻り値として使用できます.関数テンプレートを使用する場合、リロードの形式は通常の関数と同じですが、二義性の問題に注意する必要があります.