【c++】汎用プログラミングの関数テンプレート

3816 ワード

1、関数テンプレートとは
汎用プログラミングはコード再利用を実現するために用いられ,関数テンプレートは一般的な方法である.データ型はパラメータで渡すこともでき、関数定義時に特定のデータ型を指定しなくてもよく、関数呼び出しが発生した場合、コンパイラは入力したパラメータに基づいて自動的にデータ型を決定することができる.これがデータ型パラメータ化であり,データ型パラメータ化があれば,関数をさらに関数テンプレートとして抽象化することができる.関数テンプレートは実際の関数ではありません.コンパイラは実行可能なコードを生成できません.関数テンプレートを定義すると、関数機能フレームワークの説明にすぎず、具体的に実行すると、伝達された実際のパラメータに基づいてその機能が決定されます.関数テンプレートは、データ型がパラメータである関数定義として理解できます.
2、なぜテンプレート関数を導入するのか
抽象的な操作を完了する関数を作成するときに、コピー、反転、ソートなど、各データ型を処理するために複数の異なるデータ型のバージョンを定義する必要があります.max()関数を例にとると、2つのパラメータの大きい方を返します.
double max(double first, double second);
int max(int first, int second);
float max(float first, float second);
......

この関数は、異なるデータ型に対して実装が同じですが、プログラマは、各データ型に対して個別のバージョンを定義する必要があります.これにより、重複作業だけでなく、エラーが発生しやすく、メンテナンスとデバッグの作業量も大幅に増加します.さらに悪いことに、プログラムでバージョンを使用しなくても、そのコードは実行可能ファイルのサイズを増加させ、ほとんどのコンパイラは実行可能ファイルから参照されていない関数を削除しません.一般的な関数で抽象的な操作を行うと、複数の関数インスタンスを定義し、メンテナンス作業やデバッグのオーバーヘッドを招きます.解決策は、通常の関数の代わりに関数テンプレートを使用することです.
3、関数テンプレートの定義と使用
関数テンプレートの宣言は、キーワードtemplateの後に1つ以上のテンプレートに従って、尖った括弧内のパラメータとプロトタイプです.関数テンプレートは通常、max()関数を例に、ヘッダファイルに定義されます.
#include 
using namespace std;

template//   typename    class,       ,        c++        
type MAX(type num1,type num2){//        max     ,  c++            ,         
    return (num1>num2)?num1:num2;
} 
int main(){
//                
    cout<<"int:    "<1,2)<cout<<"double:    "<1.2,2.6)<

出力:
int: 2 double: 2.6
4、注意事項1関数テンプレートのtemplateキーワードと関数名の間には文もセミコロンもありません.②テンプレート関数のタイプパラメータは、テンプレート定義と厳密に一致する必要があります.一致しないと、自動タイプ変換が無効になります(ただし、インスタンス化可能な場合は手動でタイプをテンプレートタイプに変換します).次のようになります.
#include 
using namespace std;

template;//  ,       ,  ";"
type MAX(type num1,type num2){
    return (num1>num2)?num1:num2;
} 
int main(){
    cout<<"int:    "<1,2)<cout<<"double:    "<1.2,2)<//      ,  1.2    double , 2    int ,               ,    
}

③関数テンプレートの使用は、リロード関数の使用と同様であり、リロード関数の異なるリロード内部では異なるコードを実行できるが、関数テンプレートがインスタンス化された関数で実行されるコードは同じであるという違いがある.