2015年11月5日木曜日

[MT4プログラミング]テンプレートクラスを作ってみた。

ちょっと、MT4の世界でテンプレートクラスまで持ち出すシチュエーションを今ぱっと思いつきませんが、 まぁ実装されたということは要望があったということで。

 テンプレートクラスは、型宣言の一部をテンプレートとして宣言することで、実際使うときの動作を置き換えることができる仕組みです。 

サンプルでは、超適当な配列クラスをテンプレートクラスとして宣言して、実際に使うときにはint型の配列を扱いますよと形で宣言しています。

 一般的には、このように型は違うけど扱いは同じになる配列系のクラスでよく使われる仕組みとなります。 あとビジネスロジックのフレームワークとかで使われることがあるのですが、MT4でビジネスロジック????って感じですので、やっぱり主に配列系での使用になるのかと。 

MFCのCArray系や.Net Frameworkのジェネリックコレクションなど、業務プログラマではなじみの技術です。

たくさんEAやインジケータを開発する際、ソースコードの部品化を進めていく中では覚えておくとソースコード量が減るかもしれませんね。 ハッシュテーブルを自力実装している方などは、テンプレートクラスに置き換えると一挙にコード量が減るかも?

■予告
予測移動平均ボリンジャーバンドに改善のご要望がありましたので、来週アップデートいたします。
アラート機能を追加予定です。

ブログランキングにご協力よろしくお願いいたしますm(_ _ )m
にほんブログ村 為替ブログへ
にほんブログ村


 ソースコードはこちらから。
赤字になっている部分がテンプレートクラス特有の部分です。クラス宣言内ではTという形で仮の実装が行われており、使用時にintやdoubleといった型を指定してします。このように使用時に型を切り替えることができるのがテンプレートクラスの特徴です。




//テンプレート宣言
template<typename t="">
class CArrayT
{
private:
   // 内部バッファ
   T m_data[];
   
public:
   // コンストラクタ
   CArrayT()
   {
      ArrayResize(m_data, 10);
   }

   // デストラクタ
   ~CArrayT()
   {
      ArrayFree(m_data);
   }
   
   // 要素を設定する。
   void SetAt(const int index, T value) 
   {
      m_data[index] = value;
   };
   
   
   // 指定の要素を返す。
   T At(const int index) const
   {
      return m_data[index];
   };
   
   // []演算子
   T operator[](const int index) const 
   {
      return(At(index));
   }
};

void OnStart()
{
   // 使用したい型であるintを指定して配列クラスを宣言
   CArrayT<int> array ;
   
   array.SetAt(0, 5);
   
   Print(array[0]);

   // 使用したい型であるdoubleを指定して配列クラスを宣言
   CArrayT<double> array2 ;
   
   array2.SetAt(0, 1.23);
   
   Print(array2[0]);
}