Pergunta datilografada - página 2

 
Ilya Malev:

Bem, em outras palavras, você repetiu o que eu escrevi. A questão não era se ela pode ou não pode, mas por que não pode e como podemos trabalhar elegantemente em torno disso

apenas escreva funções para conversões e não se preocupe com os métodos de interruptor interno?

Duplo(CParameter<double>)

Cordão de corda(CParameter<double>)

e uso :

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

Qual é a diferença entre usar um operador unário ou uma função nomeada? Uma função é melhor - um operador já tem uma carga semântica e você não quer mudá-la à vontade.

 
fxsaber:

O controle de tipo é perdido. Veja os recursos do C++ para respostas a estas perguntas. Acho que são perguntados com bastante frequência.

Bem, pelo menos é claro que isto não é uma limitação de mql, mas uma característica do C++ em geral, e obrigado por isso :)

 
A incapacidade de sobrecarregar os operadores sem ligar o lparam do operador sobrecarregado a um objeto ou estrutura específica também é uma característica do C++?
 
Ilya Malev:

Com sobrecarga explícita e ações aritméticas, tudo fica claro. Sim, sobrecarregado = é claramente melhor neste caso, você está certo, eu estava apenas construindo precipitadamente um exemplo para uma pergunta e não pensei realmente sobre isso (embora não haja apenas int, mas também char, uchar, short, ushort, uint, bool e cor, então nem tudo é inequívoco )))))))


A questão aqui é que o tipo de valor de retornodo método sobrecarregado depende do conteúdo do objeto.

Por exemplo, temos um conjunto de vários tipos (não citarei exemplos, porque há muitos livros). E, claro, qualquer matriz deve ter a operação [] de indexação que retorna o valor de uma variável com um índice apropriado.

Mas as variáveis têm tipos diferentes. Pode ser data ou string ou mesmo algum tipo definido pelo usuário sob este índice. E idealmente, eu gostaria que o tipo de valor de retorno gerasse automaticamente o tipo apropriado ao indexar [], sem ter que parametrizá-lo explicitamente. Eu costumava resolver este "problema" desta maneira: var[(char)1], var[(short)1], var[(uint)1], etc., mas estas muletas são inúteis.

Use um conjunto de estruturas como mqlparam.

 
Dmitry Fedoseev:

Um conjunto de estruturas como mqlparam.

Não pode ser equiparado a duplo, cordel ou longo da mesma forma.

MqlParam par;

par.double_value = Perguntar;

duplo d = par; // '=' - uso de operação ilegal

 
Ilya Malev:

Não se pode equipará-lo a um duplo, cordel ou longo da mesma forma.

MqlParam par;

par.double_value = Perguntar;

duplo d = par; // '=' - uso de operação ilegal

Você vê de que tipo é e o atribui ao campo apropriado. Parece ser uma abordagem tortuosa e você ainda está procurando uma solução perfeita. Tal tarefa não deve surgir de forma alguma.

 
Ilya Malev:
A impossibilidade de sobrecarregar os operadores sem ligar o operador sobrecarregado a um objeto ou estrutura específica também é uma característica C++?

Isto é o que a internet diz sobre isto:

A sobrecarga de funções não é possível se elas diferem apenas no tipo do valor de retorno.

Norma C++14 13.1/2:

 

Encontrei isto na rede em respostas a uma pergunta semelhante:

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


Pelo que entendi, o operador está sobrecarregado aqui para digitar "operador T()" - isso significa que em C++ é pelo menos possível. Mas em mql, como eu entendo, ainda não está.

 
Ilya Malev:
uma pergunta semelhante: por que quando se sobrecarrega um método (na assinatura do método sobrecarregado) o tipo de retorno não aparece, mas apenas os tipos de parâmetros. ou seja, não é possível definir dois métodos idênticos com tipos de valores de retorno diferentes. por que esta restrição é feita? para que serve isto, por que não é possível sobrecarregar um método pelo tipo de valor de retorno com parâmetros idênticos

É provavelmente por isso:

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

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

void start() {
   f();
}

Qual função deve ser chamada exatamente?

 
pavlick_:

É provavelmente por isso:

Qual função deve ser chamada exatamente?

Um erro de descasamento do modelo deve provavelmente ocorrer no momento da compilação.


Mas na situação em que há um objeto de matriz

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

}

tal erro não deve ocorrer porque no primeiro caso a chamada da operação Array[int] é usada como parâmetro esquerdo = e não é variável dupla, mas no segundo caso é a direita, e o parâmetro esquerdo é variável de tipo duplo.

Assim, tudo se resume a querer introduzir na mql a possibilidade de sobrecarregar a operação de digitação (incluindo implícita), ou seja, definir o contexto para a chamada do método e, dependendo do esperado neste tipo de contexto de valor retornado, chamar o código requerido. E se o contexto não for definido explicitamente, isso gerará um erro.

Razão: