Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 124

 
Kommentare, die für dieses Thema nicht relevant sind, wurden nach"OOP, Vorlagen, Makros in mql5, Tipps und Tricks" verschoben.
 

Ich weiß nicht, ob es hier gepostet wurde oder nicht, aber es könnte für jemanden nützlich sein. Wenn Sie eine Methode einer parametrisierten Klasse nur danach überladen wollen, ob sie ein Argument des gleichen Typs als Wert oder als Referenz annimmt (Strukturen werden nur als Referenz übergeben, einfache Typen meist als Wert). Dies kann auf folgende Weise geschehen (und die zweite Methode gilt genau für Varianten ohne &, da sonst die grundlegende Typisierung durch Strukturen nicht kompiliert werden kann)

template<typename T>
class A
 {
public:
  A* operator<<(T&p){ Print("<< &",typename(T)); return &this; }
  template<typename F>
  A* operator<<(F p){ Print("<< ",typename(F)); return &this; }
 };

void OnStart()
 {
    double ask=Ask,bid=Bid;
    MqlTick mt;
    A<double> a1;
    a1<<Ask<<Bid<<ask;
    A<MqlTick> a2;
    a2<<mt; 
 }

Diskussion hier.

 
Ilya Malev:

Ich weiß nicht mehr, ob es hier gepostet wurde oder nicht, aber es könnte für jemanden nützlich sein. Wenn Sie eine Methode einer parametrisierten Klasse nur per Wert oder nur per Referenz überladen wollen (Strukturen werden nur per Referenz übergeben, einfache Typen meist per Wert). Dies kann auf diese Weise geschehen (außerdem muss die zweite Vorlage genau für die Variante ohne & gelten, da sonst die grundlegende Typisierung nach Strukturen nicht kompiliert werden kann)

Dann stellt sich heraus, dass eine Klasse, die für einen Strukturtyp entwickelt wurde, alle Arten von numerischen Typen akzeptieren kann. Und was soll man mit ihnen machen?

 
Alexey Navoykov:

Dann stellt sich heraus, dass eine Klasse, die für einen Strukturtyp entwickelt wurde, alle Arten von numerischen Typen akzeptieren kann. Und was soll man mit ihnen machen?

In diesem Fall ist die Klasse für gemischte Typen gedacht - sowohl für Strukturen als auch für einfache Typen, ansonsten ist dieses Konstrukt sinnlos. Um zu vermeiden, dass unnötige Typen in F verwendet werden, können Sie dort eine Prüfung auf typename(F), sizeof(F) usw. durchführen.

 
Ilya Malev:

In diesem Fall ist class für gemischte Typen gedacht - sowohl für Strukturen als auch für einfache Typen, sonst macht diese Konstruktion keinen Sinn. Um keine unnötigen Typen in F zu akzeptieren, kann man dort eine Prüfung auf typename(F), sizeof(F), etc. schreiben.

Der Typname schützt nicht davor, unnötige Typen zu akzeptieren. Dazu müssen Sie eine überladene private Methode mit einem geeigneten Typ erstellen.

Und wenn die Klasse für einen beliebigen Typ bestimmt ist, warum sollte sie dann mit einem Vorlagenparameter parametrisiert werden, was zu Verwirrung führt? Allerdings gibt es auch einfachere Varianten für Krücken, ohne Vorlagenklassen.

 
Alexey Navoykov:

Wenn eine Klasse von beliebigem Typ sein soll, warum sollte sie dann mit einem Template-Parameter parametrisiert werden, was zu Verwirrung führt?

Wie nimmt man also den richtigen Typ, der ein beliebiger Typ sein kann, ohne die Parametrisierung festzulegen? Sie können einen Parameter oder ein Feld nicht deklarieren, ohne einen Typ anzugeben. Es könnte zum Beispiel eine "Wrapper"-Klasse für einen beliebigen Datentyp sein.

Alexey Navoykov:

typename schützt nicht vor dem Akzeptieren unnötiger Typen )

Wenn Sie typename(F)==typename(T) schreiben, wird es geschützt.

 
Ilya Malev:

Wie können Sie also den richtigen Typ akzeptieren, der alles sein kann, ohne die Parametrisierung zu übergeben? Sie können einen Parameter oder ein Feld nicht deklarieren, ohne einen Typ anzugeben. Sie kann zum Beispiel eine "Wrapper"-Klasse für einen beliebigen Datentyp sein.

Warum sollte man ein Muster deklarieren, wenn sein Parameter in keiner Weise mit dem Verhalten der Klasse in Verbindung steht?

Ilya Malev:

Wenn Sie typename(F)==typename(T) schreiben, wird es geschützt.

Das ist wirklich eine grausame Sache. Sie müssen das Typename-Kontrollmittel in die Laufzeitphase übertragen. Ihre Codes werden jahrelang debuggt werden müssen

 
Können Sie mir sagen, wo ich einen regulären Trailing Stop für einen Fünfer finden kann?
 
Nikita Chernyshov:
Können Sie mir sagen, wo ich einen regulären Trailing Stop für einen Fünfer finden kann?

iSAR iOsMA EA-Nachlaufend

 
Vladimir Karputov:

iSAR iOsMA EA-Nachlaufend

Ich danke Ihnen!