テンプレートの利点
関数テンプレートは、さまざまなデータ型で配列内の最大要素を検索するなどの同様の操作を実行する必要がある場合に使用されます。テンプレートを適用する主な利点は、型ごとに別々の多重定義(オーバーロード)をコーディングする必要がないことです。複数の多重定義を型ごとに宣言する代わりに、</ t3>
double ArrayMax(double array[])
|
テンプレート関数を1つ書くだけです
template<typename T>
|
コ—ド内で使うには:
double high[];
|
ここで、使用されるデータの型を指定する T仮パラメータは、コンパイル時に実際に適用される型に置き換えられます。つまり、コンパイラはdouble、datetimeなどの型ごとに別々の関数を生成します。MQL5では、このアプローチのすべての利点を使ってクラステンプレートを開発することもできます。
クラステンプレート
クラステンプレートはtemplate キーワードの後に typenameキーワードで仮パラメータのリストを列挙する山括弧<> を使用して宣言されます 。このエントリは、クラスを実装するときに実際の変数型を定義するT仮パラメータを持つジェネリッククラスを扱うようにコンパイラに通知します。例としてT 型の要素を持つ配列を格納するためのベクトルクラスを作成しましょう。</ t10>
#define TOSTR(x) #x+" " // オブジェクト名を表示するマクロ
|
次に、さまざまな種類の作業を行うプログラムの3つのTArray オブジェクトを作成するさまざまな方法を適用しましょう。
void OnStart()
|
スクリプト実行の結果:
double_array (double:10)
|
ここでは、double、int、およびstringの異なるデータ型を持つ3つのベクトルがあります。
クラステンプレートは、任意の型の他のオブジェクトをカプセル化するために設計されるオブジェクトであるコンテナの開発にも適しています。コンテナオブジェクトは既に特定の種類のオブジェクトを含むコレクションです。通常、保存されたデータの処理は、コンテナに即座に組み込まれます。
例えば、配列外の要素にアクセスすることを許可しないクラステンプレートを作成することによって"out of range"(範囲外)重大エラーを避けることができます。
//+------------------------------------------------------------------+
|
テンプレート宣言は、クラス宣言の外にメソッドを記述する際にも使用する必要がありますのでご注意ください。
template<typename T>
|
クラステンプレートと関数テンプレートを使用すると、カンマで区切られた複数の仮パラメータの定義が可能です。下記の例は"key – value"のペアを格納するMapコレクショです。
template<typename Key, template Value>
|
参照