Cuestión de mecanografía - página 2

 
Ilya Malev:

En otras palabras, has repetido lo que yo escribí. La pregunta no era si se puede o no se puede, sino por qué no se puede y cómo podemos solucionar esto de forma elegante

¿escribir simplemente funciones para las conversiones y no molestarse con el cambio dentro de los métodos?

double Double(CParameter<double>)

string String(CParameter<double>)

y utilizar :

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

¿Cuál es la diferencia entre usar un operador unario o una función con nombre? Una función es mejor - un operador ya tiene una carga semántica y no quieres cambiarla a voluntad.

 
fxsaber:

Se pierde el control del tipo. Consulte los recursos de C++ para obtener respuestas a estas preguntas. Creo que se preguntan bastante a menudo.

Bueno, al menos queda claro que no es una limitación de mql, sino una característica de C++ en general, y gracias por ello :)

 
¿La imposibilidad de sobrecargar operadores sin vincular el lparam del operador sobrecargado a un objeto o estructura específicos es también una característica de C++?
 
Ilya Malev:

Con la sobrecarga explícita y las operaciones aritméticas todo está claro. Sí, la sobrecarga = es claramente mejor en este caso, tienes razón, sólo estaba construyendo apresuradamente un ejemplo para una pregunta y no pensé realmente en ello (aunque allí el número no es sólo int, sino también char, uchar, short, ushort, uint, bool y color, así que no todo es inequívoco )))))))


El problema aquí es que el tipo del valor de retorno delmétodo sobrecargado depende del contenido del objeto.

Por ejemplo, tenemos una matriz de varios tipos (no citaré ejemplos, porque hay muchos libros). Y, por supuesto, cualquier matriz debe tener la operación de indexación [] que devuelve el valor de una variable con un índice apropiado.

Pero las variables tienen diferentes tipos. Puede haber datetime o string o algún otro tipo definido por el usuario bajo este índice. Y lo ideal sería que el tipo de valor de retorno produjera automáticamente el tipo apropiado al indexar [], sin tener que parametrizarlo explícitamente. Yo solía resolver este "problema" de esta manera: var[(char)1], var[(short)1], var[(uint)1], etc., pero estas muletas son inútiles.

Utiliza un array de estructuras como mqlparam.

 
Dmitry Fedoseev:

Un array de estructuras como mqlparam.

No se puede equiparar al doble, a la cadena o al largo de la misma manera.

MqlParam par;

par.doble_valor = Ask;

double d = par; // '=' - uso de operación ilegal

 
Ilya Malev:

No se puede equiparar de la misma manera a un doble, una cadena o un largo.

MqlParam par;

par.doble_valor = Ask;

double d = par; // '=' - uso de operación ilegal

Se ve qué tipo es y se asigna al campo correspondiente. Parece un planteamiento torcido y sigue buscando una solución perfecta. Esta tarea no debería plantearse en absoluto.

 
Ilya Malev:
¿La imposibilidad de sobrecargar operadores sin vincular el operador sobrecargado a un objeto o estructura específicos es también una característica de C++?

Esto es lo que dice Internet sobre esto:

La sobrecarga de funciones no es posible si sólo difieren en el tipo del valor de retorno.

Norma C++14 13.1/2:

 

Encontré esto en la red en las respuestas a una pregunta similar:

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


Según tengo entendido, el operador se sobrecarga aquí al tipo "operador T()" - significa que en C++ es al menos posible. Pero en mql según tengo entendido aún no lo es.

 
Ilya Malev:
una pregunta similar: por qué al sobrecargar un método (en la firma del método sobrecargado) no aparece el tipo de retorno, sino sólo los tipos de parámetros. es decir, no se pueden definir dos métodos idénticos con tipos de valor de retorno diferentes. por qué se hace esta restricción? qué sentido tiene esto, por qué no se puede sobrecargar un método por el tipo de valor de retorno con parámetros idénticos

Probablemente sea por esto:

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

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

void start() {
   f();
}

¿A qué función hay que llamar exactamente?

 
pavlick_:

Probablemente sea por eso:

¿A qué función hay que llamar exactamente?

Probablemente debería producirse un error de desajuste de plantilla en tiempo de compilación.


Pero en la situación en la que hay un objeto array

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

}

Dicho error no debería producirse porque en el primer caso la llamada a la operación Array[int] se utiliza como parámetro izquierdo = y no es variable double, pero en el segundo caso es el derecho, y el parámetro izquierdo es variable de tipo double.

Por lo tanto, todo se reduce al deseo de introducir en mql la posibilidad de sobrecargar la operación de tipificación (incluyendo la implícita), es decir, definir el contexto de la llamada al método y, dependiendo del tipo esperado en este contexto del valor devuelto, llamar al código requerido. Y si el contexto no está definido explícitamente, generará un error.

Razón de la queja: