Frage zum Tippen - Seite 2

 
Ilya Malev:

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.

 
fxsaber:

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 :)

 
Ist die Unmöglichkeit, Operatoren zu überladen, ohne die lparam des überladenen Operators mit einem bestimmten Objekt oder einer Struktur zu verknüpfen, auch ein Merkmal von C++?
 
Ilya Malev:

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.

 
Dmitry Fedoseev:

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

 
Ilya Malev:

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.

 
Ilya Malev:
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:

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();


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.

 
Ilya Malev:
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:

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

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

void start() {
   f();
}

Welche Funktion soll genau aufgerufen werden?

 
pavlick_:

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

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];

}

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.