関数のオーバーロードは、同じ関数名で引数の型や引数の数が異なる関数を作成する事です。
引数の数や、引数の型が異なる関数はオーバーロードを意味します。
関数を呼ぶ時の実引数の型と、関数宣言の引数の一致に基づいて適切な関数を特定します。
サンプルソース:
int OnInit(){
SubFunction(1);
SubFunction(0.1);
return 0;
}
void SubFunction( double in_double ) {
Print("double_func");
}
void SubFunction( int in_double ) {
Print("int_func");
}
コンパイラは渡された実引数の型に従って、適切な関数を選択します。
シグネチャが一致したアルゴリズムが選択されます。
シグネチャは関数宣言において使われる型の事です。
コンパイラは曖昧な状況に対処する事が出来ません。
従って、関数宣言で使われていない型を実引数で渡して、暗黙的な変換に頼るべきではありません。
暗黙的な変換によりオーバーロード関数の選択が曖昧になります。
オーバーロード関数の適合に疑問を抱く動作となった場合、関数の実引数を
キャストして対応する型に変換して下さい。
MQLが用意しているオーバーロード関数は、
ArrayInitialize()の例でみる事が出来ます。
システム関数(例:
MathMax())にオーバーロードする事が出来ます。
しかし、コンパイラが正確に必要な関数を選択出来る様にソースコードを書かなければなりません。
サンプルソース:
double MathMax(double a,double b,double c);
double MathMax(double a,double b,double c=DBL_MIN);
double MathMax(int a,int b);
int MathMax(double a,double b);
システム関数のオーバーロードは不具合の元になる可能性が高いので、良い子は止めましょう。
と、個人的に思います。