Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Mit anderen Worten: Sie haben wiederholt, was ich geschrieben habe. Die Frage war nicht, ob es geht oder nicht, sondern warum es nicht geht und wie wir dieses Problem elegant umgehen können.
einfach Funktionen für Konvertierungen zu schreiben und sich nicht um die Schalter innerhalb der Methoden zu kümmern?
double Double(CParameter<double>)
string String(CParameter<double>)
und verwenden:
PrintFormat("%s %s %f",String(param1),String(param2),Double(param1));
Was ist der Unterschied zwischen der Verwendung eines unären Operators und einer benannten Funktion? Eine Funktion ist besser - ein Operator ist bereits semantisch aufgeladen, und man möchte ihn nicht nach Belieben ändern.
Die Schriftkontrolle geht verloren. Antworten auf diese Fragen finden Sie in den C++-Ressourcen. Ich glaube, sie werden ziemlich oft gefragt.
Nun, zumindest ist es klar, dass dies nicht eine Einschränkung von mql ist, sondern eine Funktion von C++ im Allgemeinen, und ich danke Ihnen dafür :)
Mit expliziten Überladungen und arithmetischen Aktionen ist alles klar. Ja, überladen = ist eindeutig besser in diesem Fall, Sie haben Recht, ich war nur hastig ein Beispiel für eine Frage zu bauen und nicht wirklich darüber nachdenken (obwohl es Zahl ist nicht nur int, sondern auch char, uchar, kurz, ushort, uint, bool und Farbe, so dass nicht alles eindeutig ist )))))))
Das Problem dabei ist, dass der Typ des Rückgabewertsder überladenen Methode vom Inhalt des Objekts abhängt.
Wir haben zum Beispiel ein Array mit mehreren Typen (ich werde keine Beispiele nennen, weil es viele Bücher gibt). Und natürlich muss jedes Array über die Indexierungsoperation [] verfügen, die den Wert einer Variablen mit einem entsprechenden Index zurückgibt.
Aber Variablen haben unterschiedliche Typen. Es kann sich dabei um datetime oder string oder sogar um einen benutzerdefinierten Typ unter diesem Index handeln. Und im Idealfall möchte ich, dass der Rückgabewert-Typ beim Indizieren von [] automatisch den entsprechenden Typ generiert, ohne ihn explizit parametrieren zu müssen. Früher habe ich dieses "Problem" auf diese Weise gelöst: var[(char)1], var[(short)1], var[(uint)1], usw., aber diese Krücken sind nutzlos.
Verwenden Sie ein Array von Strukturen wie mqlparam.
Ein Array von Strukturen wie mqlparam.
Es kann nicht in gleicher Weise mit double, string oder long gleichgesetzt werden.
MqlParam par;
par.double_value = Ask;
double d = par; // '=' - illegale Operation verwenden
Man kann es nicht mit einem Double, String oder Long gleichsetzen.
MqlParam par;
par.double_value = Ask;
double d = par; // '=' - illegale Operation verwenden
Sie sehen, um welchen Typ es sich handelt und ordnen ihn dem entsprechenden Feld zu. Es scheint ein schiefer Ansatz zu sein, und Sie suchen immer noch nach einer perfekten Lösung. Eine solche Aufgabe sollte sich gar nicht stellen.
Ist die Unmöglichkeit, Operatoren zu überladen, ohne den überladenen Operator mit einem bestimmten Objekt oder einer bestimmten Struktur zu verknüpfen, auch ein Merkmal von C++?
So steht es im Internet:
Das Überladen von Funktionen ist nicht möglich, wenn sie sich nur durch den Typ des Rückgabewerts unterscheiden.
C++14 Standard 13.1/2:
Das habe ich im Netz in Antworten auf eine ähnliche Frage gefunden:
So wie ich es verstehe, ist der Operator hier auf den Typ "operator T()" überladen - das bedeutet, dass es in C++ zumindest möglich ist. Aber in mql, so wie ich es verstehe, ist das noch nicht der Fall.
eine ähnliche frage: warum erscheint beim überladen einer methode (in der signatur der überladenen methode) nicht der rückgabetyp, sondern nur die parametertypen. d.h. man kann nicht zwei identische methoden mit unterschiedlichen rückgabewerttypen definieren. warum wird diese einschränkung gemacht? was ist der sinn darin, warum kann man eine methode nicht nach dem rückgabewerttyp mit identischen parametern überladen
Das ist wahrscheinlich der Grund:
Welche Funktion soll genau aufgerufen werden?
Das ist wahrscheinlich der Grund:
Welche Funktion soll genau aufgerufen werden?
Ein Template Mismatch-Fehler sollte wahrscheinlich zur Kompilierzeit auftreten.
Aber wenn ein Array-Objekt vorhanden ist
Ein solcher Fehler sollte nicht auftreten, da im ersten Fall der Aufruf der Operation Array[int] als linker Parameter = verwendet wird und keine Variable vom Typ double ist, im zweiten Fall jedoch der rechte, und der linke Parameter ist eine Variable vom Typ double.
Alles in allem läuft es also auf den Wunsch hinaus, in mql die Möglichkeit des Überladens von Typisierungsoperationen (einschließlich impliziter) einzuführen, d.h. einen Kontext für den Methodenaufruf zu definieren und je nach dem in diesem Kontext erwarteten Typ des zurückgegebenen Wertes den erforderlichen Code aufzurufen. Und wenn der Kontext nicht explizit definiert ist, wird ein Fehler erzeugt.