タイピングに関する質問 - ページ 2 12345678910 新しいコメント Maxim Kuznetsov 2018.12.09 23:49 #11 Ilya Malev:つまり、私が書いたことを繰り返しているわけです。問題は、できるかできないかではなく、なぜできないのか、どうすればエレガントに回避できるのか、ということだったのです変換用の関数を書くだけで、わざわざメソッド内でswitchを使わなくてもいいのでは? double Double(CParameter<double>)です。 文字列 String(CParameter<double>) を使用してください。 PrintFormat("%s %s %f",String(param1),String(param2),Double(param1))); 単項演算子と名前付き関数の違いは何ですか? 関数の方が優れています。演算子はすでに意味上の負荷を持っているので、それを勝手に変更したくないのです。 Ilya Malev 2018.12.09 23:50 #12 fxsaber:タイプコントロールができなくなる。これらの疑問に対する答えは、C++のリソースを見てください。結構、聞かれることが多いと思います。まあ、少なくとも、これはmqlの制限ではなく、C++全般の特徴であることは明らかで、ありがとうございました :) Ilya Malev 2018.12.09 23:54 #13 オーバーロードされた演算子のlparamを特定のオブジェクトや構造体にリンクさせずに演算子をオーバーロードできないのも、C++の特徴なのでしょうか? Dmitry Fedoseev 2018.12.09 23:56 #14 Ilya Malev:明示的なオーバーロードと算術演算で、すべてがクリアになります。そうですね、この場合は明らかにオーバーロードされた=の方がいいですよね、おっしゃるとおり、質問のために急いで例を作っていたので、あまり考えていませんでした(ただし、そこにはintだけでなくchar, uchar, short, ushort, uint, bool, colorもあるので、すべてが一義的とは言えませんが )))))) ここで問題になるのは、オーバーロードされたメソッドの 戻り値の型が、オブジェクトの内容に依存することです。 例えば、マルチタイプの配列があります(本がたくさんあるので、例は挙げません)。そしてもちろん、どんな配列にも、適切なインデックスを持つ変数の値を返す[]インデックス演算が必要です。 しかし、変数にはさまざまな種類があります。このインデックスの下には、datetimeやstring、その他のユーザー定義型があるかもしれません。また、理想を言えば、明示的にパラメータ化しなくても、[]のインデックスを作成する際に、戻り値の型が自動的に適切な型を生成するようにしたいです。私はこの「問題」を、var[(char)1], var[(short)1], var[(uint)1], などの方法で解決していましたが、これらの松葉杖は役に立ちません。mqlparamの ような構造体の配列を使用します。 Ilya Malev 2018.12.09 23:58 #15 Dmitry Fedoseev:mqlparamの ような構造体の配列。ダブル、ストリング、ロングと同じように同一視することはできない。 MqlParam par; par.double_value = Ask; double d = par; // '=' - 不正な操作の使用 Dmitry Fedoseev 2018.12.10 00:01 #16 Ilya Malev:ダブル、ストリング、ロングと同じように考えることはできません。 MqlParam par; par.double_value = Ask; double d = par; // '=' - 不正な操作の使用どんなタイプかを見て、適切なフィールドに割り当てるのです。曲がったやり方をしているように見えて、まだ完璧な解決策を探しているのですね。そんな課題はまったく発生しないはずです。 Dmitry Fedoseev 2018.12.10 00:02 #17 Ilya Malev: オーバーロードされた演算子を特定のオブジェクトや構造体にリンクさせずに演算子をオーバーロードすることができないのもC++の特徴なのでしょうか?これについては、ネット上ではこのように言われています。 関数のオーバーロードは、戻り値の型が異なるだけではできません。C++14標準13.1/2。 Ilya Malev 2018.12.10 00:23 #18 ネットで似たような質問に対する回答で見つけたものです。 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ではまだそうではありません。 pavlick_ 2018.12.10 03:19 #19 Ilya Malev: 同じような質問ですが、メソッドをオーバーロードするとき(オーバーロードされたメソッドの シグネチャで)、なぜ戻り値の型が表示されず、パラメータの型だけが表示されるのでしょうか。そのためでしょう。 int f() { call_something(); return 0; } double f() { call_something_other(); return 0; } void start() { f(); } 具体的にどの関数を呼び出せばいいのでしょうか? Ilya Malev 2018.12.10 03:31 #20 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 型の 変数であるため、このエラーは発生しないはずです。 つまり、メソッド呼び出しのコンテキストを定義し、そのコンテキストで期待される戻り値の型に応じて、必要なコードを呼び出すことができるようにしたいのです。また、コンテキストが明示的に定義されていない場合は、エラーが発生します。 12345678910 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
つまり、私が書いたことを繰り返しているわけです。問題は、できるかできないかではなく、なぜできないのか、どうすればエレガントに回避できるのか、ということだったのです
変換用の関数を書くだけで、わざわざメソッド内でswitchを使わなくてもいいのでは?
double Double(CParameter<double>)です。
文字列 String(CParameter<double>)
を使用してください。
PrintFormat("%s %s %f",String(param1),String(param2),Double(param1)));
単項演算子と名前付き関数の違いは何ですか? 関数の方が優れています。演算子はすでに意味上の負荷を持っているので、それを勝手に変更したくないのです。
タイプコントロールができなくなる。これらの疑問に対する答えは、C++のリソースを見てください。結構、聞かれることが多いと思います。
まあ、少なくとも、これはmqlの制限ではなく、C++全般の特徴であることは明らかで、ありがとうございました :)
明示的なオーバーロードと算術演算で、すべてがクリアになります。そうですね、この場合は明らかにオーバーロードされた=の方がいいですよね、おっしゃるとおり、質問のために急いで例を作っていたので、あまり考えていませんでした(ただし、そこにはintだけでなくchar, uchar, short, ushort, uint, bool, colorもあるので、すべてが一義的とは言えませんが ))))))
ここで問題になるのは、オーバーロードされたメソッドの 戻り値の型が、オブジェクトの内容に依存することです。
例えば、マルチタイプの配列があります(本がたくさんあるので、例は挙げません)。そしてもちろん、どんな配列にも、適切なインデックスを持つ変数の値を返す[]インデックス演算が必要です。
しかし、変数にはさまざまな種類があります。このインデックスの下には、datetimeやstring、その他のユーザー定義型があるかもしれません。また、理想を言えば、明示的にパラメータ化しなくても、[]のインデックスを作成する際に、戻り値の型が自動的に適切な型を生成するようにしたいです。私はこの「問題」を、var[(char)1], var[(short)1], var[(uint)1], などの方法で解決していましたが、これらの松葉杖は役に立ちません。
mqlparamの ような構造体の配列を使用します。
mqlparamの ような構造体の配列。
ダブル、ストリング、ロングと同じように同一視することはできない。
MqlParam par;
par.double_value = Ask;
double d = par; // '=' - 不正な操作の使用
ダブル、ストリング、ロングと同じように考えることはできません。
MqlParam par;
par.double_value = Ask;
double d = par; // '=' - 不正な操作の使用
どんなタイプかを見て、適切なフィールドに割り当てるのです。曲がったやり方をしているように見えて、まだ完璧な解決策を探しているのですね。そんな課題はまったく発生しないはずです。
オーバーロードされた演算子を特定のオブジェクトや構造体にリンクさせずに演算子をオーバーロードすることができないのもC++の特徴なのでしょうか?
これについては、ネット上ではこのように言われています。
関数のオーバーロードは、戻り値の型が異なるだけではできません。
C++14標準13.1/2。
ネットで似たような質問に対する回答で見つけたものです。
私の理解では、ここではoperator演算子がオーバーロードされて "operator T() "という型になっていますが、C++では少なくとも可能だということでしょう。しかし、私が理解しているように、mqlではまだそうではありません。
同じような質問ですが、メソッドをオーバーロードするとき(オーバーロードされたメソッドの シグネチャで)、なぜ戻り値の型が表示されず、パラメータの型だけが表示されるのでしょうか。
そのためでしょう。
具体的にどの関数を呼び出せばいいのでしょうか?
そのためでしょう。
具体的にどの関数を呼び出せばいいのでしょうか?
コンパイル時にテンプレートミスマッチエラーが発生するはずです。
しかし、配列オブジェクトが存在する状況下で
最初のケースでは、Array[int] オペレーションの呼び出しが左のパラメータ = として使用されており、変数 double ではありませんが、2番目のケースでは、右のパラメータであり、左のパラメータはdouble 型の 変数であるため、このエラーは発生しないはずです。
つまり、メソッド呼び出しのコンテキストを定義し、そのコンテキストで期待される戻り値の型に応じて、必要なコードを呼び出すことができるようにしたいのです。また、コンテキストが明示的に定義されていない場合は、エラーが発生します。