Вообще приведённый мной пример демонстрирует, так сказать, многоуровневый способ перегрузки - это особенно полезно в MQL, который ещё недостаточно продвинутый, чтобы делать многие перегрузки самостоятельно. Например, если попытаться перегрузить функции с константным аргументом по ссылке и просто аргументом по ссылке, то MQL не переварит такое. А используя данный способ, можно сделать это (правда не в глобальной видимости, а внутри класса).
Я иногда использую 2-3 уровня наследования, на каждом отсеиваются требуемые варианты.
p.s. Хотя не. Похоже я отстал от жизни, MQL уже умеет делать такие перегрузки ) Значит актуальность этого шаманства проходит
Извините. я ошибся. У автора темы стоит совсем другая задача - отделить стандартные типы от нестандартных. Стандартные в одной функции обрабатывать, а нестандартные отдельно. А вы и не заметили, что я загнал?
Требуется реализовать примерно такую конструкцию, чтобы функция могла отдельно обрабатывать переменные стандартных типов, и отдельно объекты структур. Т.е. нужна специализация шаблонной функции, либо просто сочетание шаблона и перегрузки. Но MQL ничего этого не поддерживает, в отличие от C++.
Может у кого есть идеи, как тут выкрутиться костыльными способами? Т.е. каким-то образом отделить структуры от остальных типов.
Формулировочка кривенькая. Функция в единственном числе. Наверно имеется ввиду, что бы было две функции. Поэтому не разберешь поймешь, кто что советует.
Новая версия платформы MetaTrader 5 build 1570: Улучшение витрины Маркета и расширение шаблонных функций в MQL5
MQL5: Добавлена поддержка перегрузки шаблонных функций
по параметрам. Например, есть шаблонная функция, которая записывает в
первый параметр значение второго параметра с помощью явного приведения
типов. В языке MQL5 запрещено приведение типа string к типу bool, но мы
можем сделать это сами. Создадим перегрузку шаблонной функции:
//+------------------------------------------------------------------+//| Шаблонная функция |//+------------------------------------------------------------------+template<typename T1,typename T2>
string Assign(T1 &var1,T2 var2)
{
var1=(T1)var2;
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+//| Специальная перегрузка для случая bool+string |//+------------------------------------------------------------------+string Assign(bool &var1,string var2)
{
var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
int i;
bool b;
Print(Assign(i,"test"));
Print(Assign(b,"test"));
}
В результате выполнения данного кода мы увидим, что для пары
int+string была использована шаблонная функция Assign(), а при втором
вызове для пары bool+string уже использовалась перегруженная версия.
О чем речь?
Лишняя запутанность. Сами ж пишете, что фактически тоже самое, что у меня. Только запутанней )
Ну так о схожести с Вашим вариантом сообразил уже ПОСЛЕ его написания.
Меня на этот пример навела ситуация, когда удалось перегрузить CopyTicks с идентичными (как в описании) входными параметрами.
Вообще приведённый мной пример демонстрирует, так сказать, многоуровневый способ перегрузки - это особенно полезно в MQL, который ещё недостаточно продвинутый, чтобы делать многие перегрузки самостоятельно. Например, если попытаться перегрузить функции с константным аргументом по ссылке и просто аргументом по ссылке, то MQL не переварит такое. А используя данный способ, можно сделать это (правда не в глобальной видимости, а внутри класса).
Я иногда использую 2-3 уровня наследования, на каждом отсеиваются требуемые варианты.
p.s. Хотя не. Похоже я отстал от жизни, MQL уже умеет делать такие перегрузки ) Значит актуальность этого шаманства проходит
Т.е. данные хранить изначально в классах? Ну тогда конечно вопросов бы не возникало. А речь шла именно о нативных данных.
Например, для этого.
Требуется реализовать примерно такую конструкцию, чтобы функция могла отдельно обрабатывать переменные стандартных типов, и отдельно объекты структур. Т.е. нужна специализация шаблонной функции, либо просто сочетание шаблона и перегрузки. Но MQL ничего этого не поддерживает, в отличие от C++.
Может у кого есть идеи, как тут выкрутиться костыльными способами? Т.е. каким-то образом отделить структуры от остальных типов.
void Write(T& a){ // обработчик для одних типов
}
template<typename T>
void Write(T& a,int x){ // обработчик для других типов
}
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 1570: Улучшение витрины Маркета и расширение шаблонных функций в MQL5
MetaQuotes Software Corp., 2017.03.22 16:31
Новая версия платформы MetaTrader 5 build 1570: Улучшение витрины Маркета и расширение шаблонных функций в MQL5
В результате выполнения данного кода мы увидим, что для пары int+string была использована шаблонная функция Assign(), а при втором вызове для пары bool+string уже использовалась перегруженная версия.
Таким образом, специализация происходит не через параметры вызова, а прямым указанием типов.