Bem, a STL não é uma solução de tamanho único. Aqui tem de prestar muita atenção a pormenores específicos.
Está a confundir suavidade com calor. Não é uma questão de STL. Eu próprio vou descobrir isso... (se alguém não o tem, isso não significa que não possa ser feito em princípio)
A forma mais fácil de implementar toda a funcionalidade possível com métodos abstractos numa classe ou interface de base, e nos descendentes - ou implementação ou =delte. Neste caso, é necessário passar indicações ou referências do mesmo tipo para os métodos da classe base. Embora exista um mal inevitável sob a forma de uma mesa virtual, mas é melhor organizar a arquitectura de tal forma que não haja ramificações dispendiosas via dynamic_cast em qualquer lugar.
O bug está nas prioridades de chamar funções recarregadas quando é feita uma conversão de tipo implícita para um parâmetro de ponteiro/classe. Em C++ tudo está bem, mas em MQL o erro de compilação"chamada ambígua para função sobrecarregada" Uma das variantes de trabalho é sugerida acima, mas é grande e não conveniente, e não tenho qualquer desejo de a utilizar para uma dúzia de funções semelhantes. Talvez haja algo mais simples?
Bug MT5(build 2323), Dentro de uma função de modelo, um ponteiro passado dentro de uma conversão de tipo explícito comporta-se como uma classe, causando um erro de tempo de compilação em conformidade:
#define PRINT(x) ; Print(#x, ":", string(x))
template<typename T>
class ClassWrapper{
public:
T data;
};
class ClassA{};
class ClassB : public ClassA{};
template<typename T, typename TT>
void func(const T &_wrapper, const TT &value){
T wrapper = _wrapper;
PRINT(typename(wrapper.data)); // Ok: ClassA*
PRINT(typename(value)); // Ok: ClassA*
PRINT(typename(TT)); // Ok: ClassA*//wrapper.data = (TT)(value); // Compiler Error: 'value' - object required //wrapper.data = (TT)(wrapper.data); // Compiler Error: 'data' - object required
ClassB b;
PRINT(typename((TT)(b))); // Result: C lassA. During explicit type conversion, TT is "ClassA" instead of "ClassA*"
};
voidOnStart(){
ClassWrapper<ClassA*> a_ptr_wrapper;
ClassA a;
const ClassA* a_ptr = &a;
func(a_ptr_wrapper, a_ptr);
};
Burro, não consegue resolver um problema simples. Preciso de compreender que a negociação é proibida durante as seguintes configurações de arranque da EA.
bool CheckTradingPermission()
{
//--- Для режима реального времениif(IsRealtime())
{
//--- Проверка соединения с серверомif(!TerminalInfoInteger(TERMINAL_CONNECTED))
return(false);
//--- Разрешение на торговлю на уровне данной запущенной программыif(!MQLInfoInteger(MQL_TRADE_ALLOWED))
return(false);
//--- Разрешение на торговлю на уровне терминалаif(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
return(false);
//--- Разрешение на торговлю для текущего счетаif(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
return(false);
//--- Разрешение на автоматическую торговлю для текущего счетаif(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
return(false);
}
//---return(true);
}
Опубликовал статью ZigZag всему голова (Часть II): Примеры получения, обработки и отображения данных В первой части был описан модифицированный индикатор ZigZag и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать...
Burro, não consegue resolver um problema simples. Preciso de compreender que a negociação é proibida durante as seguintes configurações de arranque da EA.
Esta verificação não funciona.
OrderCheck é um engano vermelho. Por favor, aconselhar.
Não tenho a certeza do meu telemóvel, mas aqui está:MQL_TRADE_ALLOWED
Bug MT5(build 2323), o mesmo objecto modelo B<int> pode ser criado após objecto da classe B<void*>, mas se for feito antes, ocorre um erro de compilação. Provavelmente a razão é o trabalho da cache do gerador de classes modelo.
template<typename T>
class B{
T data;
};
voidOnStart (){
//B<int> b_int_0; // Compiler Error 'void' - unexpected token, probably type is missing?
B<void*> b; // OK
B<int> b_int_1; // OK
}
Bug MT5(build 2340) usa o mesmo código duas vezes: primeiro passe - compilação bem sucedida, segundo passe - erro de compilação. Aparentemente, os problemas estão relacionados com a cache do gerador de funções modelo. O erro desaparece se para a função modelo "void run(const T &ff)" a transferência por referência é substituída pela transferência pelo valor"void run(const T ff)".
Bem, a STL não é uma solução de tamanho único. Aqui tem de prestar muita atenção a pormenores específicos.
Está a confundir suavidade com calor.
Não é uma questão de STL. Eu próprio vou descobrir isso... (se alguém não o tem, isso não significa que não possa ser feito em princípio)
A forma mais fácil de implementar toda a funcionalidade possível com métodos abstractos numa classe ou interface de base, e nos descendentes - ou implementação ou =delte.
Neste caso, é necessário passar indicações ou referências do mesmo tipo para os métodos da classe base.
Embora exista um mal inevitável sob a forma de uma mesa virtual, mas é melhor organizar a arquitectura de tal forma que não haja ramificações dispendiosas via dynamic_cast em qualquer lugar.
O método que sugeriu foi implementado anteriormente e também depende do mesmo bug:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191
O bug está nas prioridades de chamar funções recarregadas quando é feita uma conversão de tipo implícita para um parâmetro de ponteiro/classe.
Em C++ tudo está bem, mas em MQL o erro de compilação"chamada ambígua para função sobrecarregada"
Uma das variantes de trabalho é sugerida acima, mas é grande e não conveniente, e não tenho qualquer desejo de a utilizar para uma dúzia de funções semelhantes.
Talvez haja algo mais simples?
Os desenvolvedores, por favor aconselhem, existem planos para corrigiro bug ou isto é arquitectonicamente impossível?
Dentro de uma função de modelo, um ponteiro passado dentro de uma conversão de tipo explícito comporta-se como uma classe, causando um erro de tempo de compilação em conformidade:
Burro, não consegue resolver um problema simples. Preciso de compreender que a negociação é proibida durante as seguintes configurações de arranque da EA.
Esta verificação não funciona.
OrderCheck é um engano vermelho. Por favor, aconselhar.
Código ANATOLI KAZHARSKI
Obrigado, não reparei no MQL_TRADE_ALLOWED.
Burro, não consegue resolver um problema simples. Preciso de compreender que a negociação é proibida durante as seguintes configurações de arranque da EA.
Esta verificação não funciona.
OrderCheck é um engano vermelho. Por favor, aconselhar.
Provavelmente a razão é o trabalho da cache do gerador de classes modelo.
Bug MT5(build 2340) usa o mesmo código duas vezes: primeiro passe - compilação bem sucedida, segundo passe - erro de compilação.
Aparentemente, os problemas estão relacionados com a cache do gerador de funções modelo.
O erro desaparece se para a função modelo "void run(const T &ff)" a transferência por referência é substituída pela transferência pelo valor"void run(const T ff)".
Bug MT5(build 2340) Erro de compilação ao tentar aceder à classe interna para um parâmetro de modelo de uma função de modelo.