![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А стринги, массивы, всякие float, ushort, char и т.п. ?
Значит, вариант со switch рабочий, хоть и тормозной.
Почему вы решили, что он рабочий? Приведите пример.
void WriteStruct( T& Value ) { Print(__FUNCSIG__); }
template<typename T>
void WriteStandart( T& Value ) { Print(__FUNCSIG__); }
template<typename T>
void Write( T& Value )
{
const string Type = typename(T);
if ((Type == "int") || (Type == "double") /* || () || ... - все стандартные типы */)
WriteStandart(Value);
else
WriteStruct(Value);
}
void OnStart()
{
MqlTick Tick;
int Num;
Write(Num);
Write(Tick);
}
void WriteStruct( T& Value ) { Print(__FUNCSIG__); }
template<typename T>
void WriteStandart( T& Value ) { Print(__FUNCSIG__); }
template<typename T>
void Write( T& Value )
{
const string Type = typename(T);
if ((Type == "int") || (Type == "double") /* || () || ... - все стандартные типы */)
WriteStandart(Value);
else
WriteStruct(Value);
}
void OnStart()
{
MqlTick Tick;
int Num;
Write(Num);
Write(Tick);
}
Всё дело в том, что эти функции -пустышки. А попробуйте-ка в WriteStruct обратиться к полям структуры, либо в WriteStandart произвести какое-то действие с числовой переменной. Ваши иллюзии вмиг рассеятся :)
Как я уже говорил, разделять типы нужно на уровне компилятора. А в рантайме это можно сделать лишь в том случае, если типы приводятся друг к другу. В данном же случае int и MqlTick несовместимы.
Нет, в первом ответе предложили совсем другое. Там речь шла о шаблонах классах, которых на тот момент даже ещё не было в MQL. Видимо тот человек был такой же, как Комбинатор, прилетевший из будущего :)
Всё дело в том, что эти функции -пустышки. А попробуйте-ка в WriteStruct обратиться к полям структуры, либо в WriteStandart произвести какое-то действие с числовой переменной. Ваши иллюзии вмиг рассеятся :)
Как я уже говорил, разделять типы нужно на уровне компилятора. А в рантайме это можно сделать лишь в том случае, если типы приводятся друг к другу. В данном же случае int и MqlTick несовместимы.
Ничего подобного. Мой ответ был абсолютно рабочим на момент написания.
Рабочим где? В С++? :)
В MQL шаблоны классов появились лишь в октябре-ноябре прошлого года, а ваш пост был годом ранее.
Да и, честно говоря, не очень понятно, что вы там конкретно предлагали. Почему бы не пояснить всё кодом, вместо словесного описания.
Рабочим где? В С++? :)
В MQL шаблоны классов появились лишь в октябре-ноябре прошлого года, а ваш пост был годом ранее.
Да и, честно говоря, не очень понятно, что вы там конкретно предлагали. Почему бы не пояснить всё кодом, вместо словесного описания.
Например, делаете базовый класс:
{
public:
virtual bool write() const
{
return false;
}
};
от него наследуете Double, Long и прочие классы, включая и Struct (содержащий структуру). Тогда вызов шаблонной Write(T) можно заменить на виртуальный t.write().