C++:関数テンプレート

4609 ワード

C++は関数テンプレート(function template)を提供する.関数テンプレートとは、実際には、関数タイプとパラメータタイプが具体的に指定されず、仮想タイプで表される汎用関数を確立することです.この汎用関数を関数テンプレートと呼ぶ.関数体が同じ関数はすべてこのテンプレートで代用することができて、複数の関数を定義する必要はなくて、テンプレートの中で一回定義するだけでいいです.関数を呼び出すと、テンプレート内の仮想タイプの代わりに実パラメータのタイプに基づいてシステムが置き換えられ、異なる関数の機能が実現されます.
関数テンプレート定義形式template<タイプ形式パラメータテーブル>タイプ形式パラメータの形式は、typename T 1,typename T 2,…,typename Tnまたはclass T 1,class T 2,…,class Tn
myswap< float >(a, b);//表示タイプ呼び出しmyswap(a,b);//自動データ型導出
関数テンプレートが関数の再ロードに遭遇しました
関数テンプレートと一般関数の違い:関数テンプレートでは自動タイプ変換は許可されません.
関数テンプレートと一般関数を一緒に呼び出すルール:1関数テンプレートは、一般関数のように2 C++コンパイラによって優先的に再ロードできます2 C++コンパイラは、一般関数3を優先的に考慮します.関数テンプレートがより良いマッチングを生成できる場合、テンプレート4を選択すると、空のテンプレートの実パラメータリストの構文によってコンパイラがテンプレートマッチングのみを通過することを制限できます.
関数テンプレートメカニズムコンパイラは、関数テンプレートを任意のクラスを処理できる関数コンパイラに処理するのではなく、関数テンプレートから具体的なタイプによって異なる関数コンパイラを生成すると、関数テンプレートを2回コンパイルし、宣言された場所でテンプレートコード自体をコンパイルします.呼び出した場所でパラメータ置換後のコードをコンパイルします.
#include 

using namespace std;

//           int  char  double   
void Swap(int &a,  int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

void Swap(char &a, char &b)
{
    char tmp = a;
    a = b;
    b = tmp;
}

void Swap(double &a, double &b)
{
    double tmp = a;
    a = b;
    b = tmp;
}

//     :      ,              

//      :                             
//        :       (    )
//     :   ----->                     
//   :              ?     ----->      


//       :  template           
template <typename T> 
void mySwap(T &a,  T &b)
{
    T tmp = a;
    a = b;
    b = tmp;
}

template <typename T>
void myPrint(T a, T b)
{
    cout << "a = " << a << ", b = " << b << endl;
}


int main()
{
    int a = 10;
    int b = 20;

    mySwap(a, b);    //                          
    // cout << "a = " << a << ", b = " << b << endl;
    myPrint(a, b);

    //          :     ?
    mySwap<int>(a, b);
    // cout << "a = " << a << ", b = " << b << endl;
    myPrint<int>(a, b);

    char c1 = 'a';
    char c2 = 'b';
    mySwap<char>(c1, c2);
    // cout << "a = " << c1 << ", b = " << c2 << endl;
    myPrint<char>(c1, c2);

    double d1 = 1.2;
    double d2 = 2.3;
    mySwap<double>(d1, d2);
    // cout << "a = " << d1 << ", b = " << d2 << endl;
    myPrint<double>(d1, d2);
    return 0;
}