タイピングに関する質問 - ページ 2

 
Ilya Malev:

つまり、私が書いたことを繰り返しているわけです。問題は、できるかできないかではなく、なぜできないのか、どうすればエレガントに回避できるのか、ということだったのです

変換用の関数を書くだけで、わざわざメソッド内でswitchを使わなくてもいいのでは?

double Double(CParameter<double>)です。

文字列 String(CParameter<double>)

を使用してください。

PrintFormat("%s %s %f",String(param1),String(param2),Double(param1)));

単項演算子と名前付き関数の違いは何ですか? 関数の方が優れています。演算子はすでに意味上の負荷を持っているので、それを勝手に変更したくないのです。

 
fxsaber:

タイプコントロールができなくなる。これらの疑問に対する答えは、C++のリソースを見てください。結構、聞かれることが多いと思います。

まあ、少なくとも、これはmqlの制限ではなく、C++全般の特徴であることは明らかで、ありがとうございました :)

 
オーバーロードされた演算子のlparamを特定のオブジェクトや構造体にリンクさせずに演算子をオーバーロードできないのも、C++の特徴なのでしょうか?
 
Ilya Malev:

明示的なオーバーロードと算術演算で、すべてがクリアになります。そうですね、この場合は明らかにオーバーロードされた=の方がいいですよね、おっしゃるとおり、質問のために急いで例を作っていたので、あまり考えていませんでした(ただし、そこにはintだけでなくchar, uchar, short, ushort, uint, bool, colorもあるので、すべてが一義的とは言えませんが ))))))


ここで問題になるのは、オーバーロードされたメソッドの 戻り値の型が、オブジェクトの内容に依存することです。

例えば、マルチタイプの配列があります(本がたくさんあるので、例は挙げません)。そしてもちろん、どんな配列にも、適切なインデックスを持つ変数の値を返す[]インデックス演算が必要です。

しかし、変数にはさまざまな種類があります。このインデックスの下には、datetimeやstring、その他のユーザー定義型があるかもしれません。また、理想を言えば、明示的にパラメータ化しなくても、[]のインデックスを作成する際に、戻り値の型が自動的に適切な型を生成するようにしたいです。私はこの「問題」を、var[(char)1], var[(short)1], var[(uint)1], などの方法で解決していましたが、これらの松葉杖は役に立ちません。

mqlparamの ような構造体の配列を使用します。

 
Dmitry Fedoseev:

mqlparamの ような構造体の配列。

ダブル、ストリング、ロングと同じように同一視することはできない。

MqlParam par;

par.double_value = Ask;

double d = par; // '=' - 不正な操作の使用

 
Ilya Malev:

ダブル、ストリング、ロングと同じように考えることはできません。

MqlParam par;

par.double_value = Ask;

double d = par; // '=' - 不正な操作の使用

どんなタイプかを見て、適切なフィールドに割り当てるのです。曲がったやり方をしているように見えて、まだ完璧な解決策を探しているのですね。そんな課題はまったく発生しないはずです。

 
Ilya Malev:
オーバーロードされた演算子を特定のオブジェクトや構造体にリンクさせずに演算子をオーバーロードすることができないのもC++の特徴なのでしょうか?

これについては、ネット上ではこのように言われています。

関数のオーバーロードは、戻り値の型が異なるだけではできません。

C++14標準13.1/2。

 

ネットで似たような質問に対する回答で見つけたものです。

template<typename T> T f();
template<> int f() { return 2; }
template<> double f() { return 2.7; }

//...
struct F {
    F() {}
    template<typename T> operator T() { return f<T>(); }
};

int x2 = F();
double y2 = F();


私の理解では、ここではoperator演算子がオーバーロードされて "operator T() "という型になっていますが、C++では少なくとも可能だということでしょう。しかし、私が理解しているように、mqlではまだそうではありません。

 
Ilya Malev:
同じような質問ですが、メソッドをオーバーロードするとき(オーバーロードされたメソッドの シグネチャで)、なぜ戻り値の型が表示されず、パラメータの型だけが表示されるのでしょうか。

そのためでしょう。

int f() {
   call_something();
   return 0;
}

double f() {
   call_something_other();
   return 0;
}

void start() {
   f();
}

具体的にどの関数を呼び出せばいいのでしょうか?

 
pavlick_:

そのためでしょう。

具体的にどの関数を呼び出せばいいのでしょうか?

コンパイル時にテンプレートミスマッチエラーが発生するはずです。


しかし、配列オブジェクトが存在する状況下で

class Array{

public:

Array *operator[] (int i){ id = i; return GetPointer( this ); }

double operator[]( int i){ id = i; return data[i]; }

Array *operator=(double d){ data[id]=d; return GetPointer( this ); }

private:

double data[10];

int id;

};



int OnStart(){

  Array array;

  double d=123.456;

  array[5]=d;

  d=array[5];

}

最初のケースでは、Array[int] オペレーションの呼び出しが左のパラメータ = として使用されており、変数 double ではありませんが、2番目のケースでは、右のパラメータであり、左のパラメータはdouble 型の 変数であるため、このエラーは発生しないはずです。

つまり、メソッド呼び出しのコンテキストを定義し、そのコンテキストで期待される戻り値の型に応じて、必要なコードを呼び出すことができるようにしたいのです。また、コンテキストが明示的に定義されていない場合は、エラーが発生します。

理由: