Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 124

 
I commenti non pertinenti a questo argomento sono stati spostati in"OOP, modelli, macro in mql5, consigli e trucchi del mestiere".
 

Non so se è stato postato qui o no, ma potrebbe essere utile a qualcuno. Quando si vuole sovraccaricare un metodo di una classe parametrizzata solo dal fatto che prenda un argomento dello stesso tipo per valore o per riferimento (le strutture vengono passate solo per riferimento, i tipi semplici più spesso per valore). Può essere fatto in questo modo (e il secondo modo si applica esattamente alla variante senza &, altrimenti la tipizzazione di base per strutture non compilerà)

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

Discussione qui.

 
Ilya Malev:

Non ricordo se era qui o no, ma può essere utile a qualcuno. Quando volete sovraccaricare un metodo di una classe parametrizzata solo per valore, o solo per riferimento (le strutture sono passate solo per riferimento, i tipi semplici più spesso per valore). Questo può essere fatto in questo modo (inoltre, il secondo template si applica esattamente alla variante senza &, altrimenti la tipizzazione di base per strutture non compilerà)

Poi si scopre che una classe progettata per un tipo di struttura può accettare ogni sorta di tipo numerico. E cosa fare con loro?

 
Alexey Navoykov:

Poi si scopre che una classe progettata per un tipo di struttura può accettare ogni sorta di tipo numerico. E cosa fare con loro?

In questo caso, la classe è intesa per tipi misti - sia per strutture che per tipi semplici, altrimenti questo costrutto non ha senso. Per evitare di prendere tipi inutili in F, potete scrivere un controllo per typename(F), sizeof(F), ecc.

 
Ilya Malev:

In questo caso la classe è intesa per il tipo misto - sia per le strutture che per i tipi semplici, altrimenti questa costruzione non ha senso. Per non accettare tipi inutili in F, si può scrivere lì un controllo per typename(F), sizeof(F), ecc.

Il typename non proteggerà dall'accettare tipi non necessari) Per questo, è necessario fare un metodo privato sovraccaricato con un tipo appropriato.

E se la classe è destinata a qualsiasi tipo, perché parametrizzarla con un parametro template, creando confusione? Anche se ci sono varianti più semplici per crutch, senza classi template.

 
Alexey Navoykov:

se una classe è destinata ad essere di qualsiasi tipo, perché parametrizzarla con un parametro template, creando confusione?

Quindi come si fa a prendere il tipo giusto, che può essere qualsiasi tipo, senza impegnare la parametrizzazione? Non si può dichiarare un parametro o un campo senza specificare un tipo. Per esempio, potrebbe essere una classe "wrapper" su un tipo di dati arbitrario.

Alexey Navoykov:

typename non protegge dall'accettare tipi non necessari)

Se scrivete typename(F)==typename(T), proteggerà.

 
Ilya Malev:

Quindi, come otterrete il tipo giusto, che può essere qualsiasi cosa, senza passare la parametrizzazione? Non si può dichiarare un parametro o un campo senza specificare un tipo. Per esempio, può essere una classe "wrapper" per un tipo di dati arbitrario.

Beh, allora è solo la classe A. Perché dichiarare un modello se il suo parametro non è in alcun modo legato al comportamento della classe?

Ilya Malev:

Se scrivete typename(F)==typename(T), lo proteggerà.

Questa è davvero una cosa crudele da fare. Dovrete spostare il controllo typename nella fase di runtime. I vostri codici dovranno essere debuggati per anni

 
Potete dirmi dove posso cercare un trailing stop regolare per cinque dollari?
 
Nikita Chernyshov:
Potete dirmi dove posso cercare un trailing stop regolare per cinque dollari?

iSAR iOsMA EA-Trailing

 
Vladimir Karputov:

iSAR iOsMA EA-Trailing

Grazie!