Caractéristiques du langage mql5, subtilités et techniques - page 124

 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "OOP, templates, macros dans mql5, trucs et astuces du métier ".
 

Je ne sais pas si elle a été publiée ici ou non, mais elle pourrait être utile à quelqu'un. Lorsque l'on veut surcharger une méthode d'une classe paramétrée uniquement par le fait qu'elle prend un argument du même type par valeur ou par référence (les structures sont passées uniquement par référence, les types simples le plus souvent par valeur). Cela peut être fait de cette façon (et la deuxième façon s'applique exactement à la variante sans &, sinon le typage de base par les structures ne compilera pas)

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

Discussion ici.

 
Ilya Malev:

Je ne me souviens pas si c'était ici ou non, mais cela peut être utile à quelqu'un. Lorsque vous voulez surcharger une méthode d'une classe paramétrée par valeur seulement, ou par référence seulement (les structures sont passées par référence seulement, les types simples le plus souvent par valeur). Cela peut être fait de cette façon (de plus, le deuxième modèle s'applique exactement à la variante sans &, sinon le typage de base par structures ne compilera pas)

Il s'avère ensuite qu'une classe conçue pour un type de structure peut accepter toutes sortes de types numériques. Et que faire d'eux ?

 
Alexey Navoykov:

Il s'avère ensuite qu'une classe conçue pour un type de structure peut accepter toutes sortes de types numériques. Et que faire d'eux ?

Dans ce cas, la classe est destinée aux types mixtes - à la fois aux structures et aux types simples, sinon cette construction n'a pas de sens. Pour éviter de prendre des types inutiles dans F, vous pouvez y écrire une vérification pour typename(F), sizeof(F), etc.

 
Ilya Malev:

Dans ce cas, la classe est destinée à un type mixte - à la fois pour les structures et les types simples, sinon cette construction n'a pas de sens. Afin de ne pas accepter des types inutiles dans F, vous pouvez y écrire une vérification pour typename(F), sizeof(F), etc.

Le typename ne protège pas de l'acceptation de types inutiles). Pour cela, vous devez créer une méthode privée surchargée avec un type approprié.

Et si la classe est destinée à n'importe quel type, pourquoi la paramétrer avec un paramètre de modèle, créant ainsi une confusion ? Bien qu'il existe des variantes plus simples pour la béquille, sans classes de modèles.

 
Alexey Navoykov:

si une classe est destinée à être de n'importe quel type, pourquoi la paramétrer avec un paramètre de modèle, créant ainsi une confusion ?

Alors comment prendre le bon type, qui peut être n'importe quel type, sans engager le paramétrage ? Vous ne pouvez pas déclarer un paramètre ou un champ sans spécifier un type. Par exemple, il pourrait s'agir d'une classe "enveloppante" sur un type de données arbitraire.

Alexey Navoykov:

typename ne protège pas contre l'acceptation de types inutiles )

Si vous écrivez typename(F)==typename(T), cela protégera.

 
Ilya Malev:

Alors comment obtenir le bon type, qui peut être n'importe quoi, sans passer par la paramétrisation ? Vous ne pouvez pas déclarer un paramètre ou un champ sans spécifier un type. Par exemple, il peut s'agir d'une classe "enveloppante" pour un type de données arbitraire.

Dans ce cas, il s'agit simplement de la classe A. Pourquoi déclarer un motif si son paramètre n'est en aucune façon lié au comportement de la classe ?

Ilya Malev:

Si vous écrivez typename(F)==typename(T), il le protégera.

C'est vraiment une chose cruelle à faire. Vous devrez déplacer le contrôle de typename au stade de l'exécution. Vos codes devront être débogués pendant des années.

 
Pouvez-vous me dire où je peux trouver un stop suiveur régulier pour cinq dollars ?
 
Nikita Chernyshov:
Pouvez-vous me dire où je peux trouver un stop suiveur régulier pour cinq dollars ?

iSAR iOsMA EA-Trailing (suivi)

 
Vladimir Karputov:

iSAR iOsMA EA-Trailing (suivi)

Merci !

Raison: