Question sur la dactylographie - page 2

 
Ilya Malev:

En d'autres termes, vous avez répété ce que j'ai écrit. La question n'est pas de savoir si c'est possible ou non, mais pourquoi ce n'est pas possible et comment contourner ce problème de manière élégante.

écrire simplement des fonctions pour les conversions et ne pas s'embêter avec les switchs dans les méthodes ?

double Double(CParameter<double>)

string String(CParameter<double>)

et utiliser :

PrintFormat("%s %s %f",String(param1),String(param2),Double(param1)) ;

Quelle est la différence entre l'utilisation d'un opérateur unaire et d'une fonction nommée ? Une fonction est préférable - un opérateur a déjà une charge sémantique et vous ne voulez pas la changer à volonté.

 
fxsaber:

Le contrôle du type est perdu. Consultez les ressources C++ pour trouver les réponses à ces questions. Je pense qu'on les demande assez souvent.

Au moins, il est clair que ce n'est pas une limitation de mql, mais une caractéristique du C++ en général, et je vous en remercie :)

 
L'impossibilité de surcharger des opérateurs sans lier le lparam de l'opérateur surchargé à un objet ou une structure spécifique est-elle également une caractéristique du C++ ?
 
Ilya Malev:

Avec la surcharge explicite et les actions arithmétiques, tout est clair. Oui, la surcharge = est clairement meilleure dans ce cas, vous avez raison, j'ai juste construit à la hâte un exemple pour une question et je n'y ai pas vraiment pensé (bien que le nombre ne soit pas seulement int, mais aussi char, uchar, short, ushort, uint, bool et color, donc tout n'est pas sans ambiguïté )))))))


Le problème ici est que le type de la valeur de retourde la méthode surchargée dépend du contenu de l'objet.

Par exemple, nous avons un tableau multi-types (je ne citerai pas d'exemples, car il y a beaucoup de livres). Et bien sûr, tout tableau doit avoir l'opération d'indexation [] qui renvoie la valeur d'une variable avec un index approprié.

Mais les variables ont différents types. Il peut s'agir d'une date, d'une chaîne ou même d'un type défini par l'utilisateur sous cet index. Et idéalement, je voudrais que le type de valeur de retour génère automatiquement le type approprié lors de l'indexation de [], sans avoir à le paramétrer explicitement. J'avais l'habitude de résoudre ce "problème" de cette façon : var[(char)1], var[(short)1], var[(uint)1], etc., mais ces béquilles sont inutiles.

Utilisez un tableau de structures comme mqlparam.

 
Dmitry Fedoseev:

Un tableau de structures comme mqlparam.

Il ne peut pas être assimilé au double, à la corde ou à la longue de la même manière.

MqlParam par ;

par.double_value = Ask ;

double d = par ; // '=' - utilisation d'une opération illégale

 
Ilya Malev:

Vous ne pouvez pas l'assimiler à une double, une corde ou une longue de la même manière.

MqlParam par ;

par.double_valeur = Ask ;

double d = par ; // '=' - utilisation d'une opération illégale

Vous voyez de quel type il s'agit et l'affectez au champ approprié. Cela semble être une approche tordue et vous êtes toujours à la recherche d'une solution parfaite. Une telle tâche ne devrait pas se présenter du tout.

 
Ilya Malev:
L'impossibilité de surcharger des opérateurs sans lier l'opérateur surchargé à un objet ou une structure spécifique est-elle également une caractéristique du C++ ?

Voici ce que dit l'internet à ce sujet :

La surcharge des fonctions n'est pas possible si elles ne diffèrent que par le type de la valeur de retour.

C++14 standard 13.1/2 :

 

J'ai trouvé ceci sur le net dans les réponses à une question similaire :

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


Si je comprends bien, l'opérateur est surchargé ici en type "operator T()" - cela signifie qu'en C++ c'est au moins possible. Mais dans mql, tel que je le comprends, ce n'est pas encore le cas.

 
Ilya Malev:
une question similaire : pourquoi, lors de la surcharge d'une méthode (dans la signature de la méthode surchargée), le type de retour n'apparaît pas, mais seulement les types de paramètres. c'est-à-dire que vous ne pouvez pas définir deux méthodes identiques avec des types de valeur de retour différents. pourquoi cette restriction ? quel est l'intérêt de cela, pourquoi ne peut-on pas surcharger une méthode par le type de valeur de retour avec des paramètres identiques ?

C'est probablement pour cela :

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

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

void start() {
   f();
}

Quelle fonction doit être appelée exactement ?

 
pavlick_:

C'est probablement pour ça :

Quelle fonction doit être appelée exactement ?

Une erreur d'incompatibilité de modèle devrait probablement se produire au moment de la compilation.


Mais dans la situation où il y a un objet de type tableau

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

}

Une telle erreur ne devrait pas se produire car dans le premier cas, l'appel de l'opération Array[int] est utilisé comme paramètre de gauche = et n'est pas une variable de type double, mais dans le second cas, c'est le paramètre de droite, et le paramètre de gauche est une variable de type double.

Donc, tout compte fait, cela revient à souhaiter introduire dans mql la possibilité de surcharger les opérations de typage (y compris implicites), c'est-à-dire définir le contexte de l'appel de la méthode et, en fonction du type de valeur retournée attendu dans ce contexte, appeler le code requis. Et si le contexte n'est pas défini explicitement, il générera une erreur.

Raison: