Beh, STL non è una soluzione unica per tutti. Qui bisogna prestare molta attenzione ai dettagli.
Stai confondendo il morbido con il caldo. Non è una questione di STL. Ci penserò io stesso... (se qualcuno non ce l'ha, non significa che non si possa fare in linea di principio)
Il modo più semplice per implementare tutte le funzionalità possibili con metodi astratti in una classe base o interfaccia, e nei discendenti - o implementazione o =delte. In questo caso, è necessario passare puntatori o riferimenti dello stesso tipo ai metodi della classe base. Anche se c'è un male inevitabile sotto forma di una tabella virtuale, ma è meglio organizzare l'architettura in modo tale che non ci siano costose ramificazioni dynamic_cast da nessuna parte.
Il bug è nelle priorità della chiamata di funzioni ricaricate quando viene eseguita una conversione implicita di tipo per un parametro puntatore/classe. In C++ tutto è OK, ma in MQL l'errore di compilazione"ambiguous call to overloaded function" Una delle varianti di workaround è suggerita sopra, ma è grande e non conveniente, e non ho voglia di usarla per una dozzina di funzioni simili. Forse c'è qualcosa di più semplice?
Bug MT5(build 2323), All'interno di una funzione template, un puntatore passato all'interno di una conversione di tipo esplicita si comporta come una classe, causando di conseguenza un errore di compilazione:
#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);
};
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 и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать...
Bug MT5(build 2323), lo stesso oggetto template B<int> può essere creato dopo l'oggetto di classe B<void*>, ma se fatto prima, si verifica un errore di compilazione. Probabilmente la ragione è il lavoro della cache del generatore di classi template.
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
}
Il bug MT5 (build 2340) usa lo stesso codice due volte: primo passaggio - compilazione riuscita, secondo passaggio - errore di compilazione. Apparentemente i problemi sono legati alla cache del generatore di funzioni template. L'errore scompare se per la funzione template "void run(const T &ff)" il trasferimento per riferimento è sostituito dal trasferimento per valore"void run(const T ff)".
Beh, STL non è una soluzione unica per tutti. Qui bisogna prestare molta attenzione ai dettagli.
Stai confondendo il morbido con il caldo.
Non è una questione di STL. Ci penserò io stesso... (se qualcuno non ce l'ha, non significa che non si possa fare in linea di principio)
Il modo più semplice per implementare tutte le funzionalità possibili con metodi astratti in una classe base o interfaccia, e nei discendenti - o implementazione o =delte.
In questo caso, è necessario passare puntatori o riferimenti dello stesso tipo ai metodi della classe base.
Anche se c'è un male inevitabile sotto forma di una tabella virtuale, ma è meglio organizzare l'architettura in modo tale che non ci siano costose ramificazioni dynamic_cast da nessuna parte.
Il metodo che hai suggerito è stato implementato prima e si basa anche sullo stesso bug:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191
Il bug è nelle priorità della chiamata di funzioni ricaricate quando viene eseguita una conversione implicita di tipo per un parametro puntatore/classe.
In C++ tutto è OK, ma in MQL l'errore di compilazione"ambiguous call to overloaded function"
Una delle varianti di workaround è suggerita sopra, ma è grande e non conveniente, e non ho voglia di usarla per una dozzina di funzioni simili.
Forse c'è qualcosa di più semplice?
Sviluppatori, per favore avvisate, ci sono piani per risolvereil bug o è architettonicamente impossibile?
All'interno di una funzione template, un puntatore passato all'interno di una conversione di tipo esplicita si comporta come una classe, causando di conseguenza un errore di compilazione:
Stupido, non riesce a risolvere un semplice problema. Ho bisogno di capire che il trading è vietato durante le seguenti impostazioni di avvio dell'EA.
Questo controllo non funziona.
OrderCheck è una falsa pista. Si prega di avvisare.
Codice ANATOLI KAZHARSKI
Grazie, non avevo notato il MQL_TRADE_ALLOWED.
Stupido, non riesce a risolvere un semplice problema. Ho bisogno di capire che il trading è vietato durante le seguenti impostazioni di avvio dell'EA.
Questo controllo non funziona.
OrderCheck è una falsa pista. Si prega di avvisare.
Probabilmente la ragione è il lavoro della cache del generatore di classi template.
Il bug MT5 (build 2340) usa lo stesso codice due volte: primo passaggio - compilazione riuscita, secondo passaggio - errore di compilazione.
Apparentemente i problemi sono legati alla cache del generatore di funzioni template.
L'errore scompare se per la funzione template "void run(const T &ff)" il trasferimento per riferimento è sostituito dal trasferimento per valore"void run(const T ff)".
Bug MT5(build 2340) Errore di compilazione quando si tenta di accedere alla classe interna per un parametro template di una funzione template.