Требуется решение (специализация шаблонной функции) - страница 4

 
fxsaber:
О чем речь?
Лишняя запутанность.  Сами ж пишете, что фактически тоже самое, что у меня. Только запутанней )
 
Alexey Navoykov:
Лишняя запутанность.  Сами ж пишете, что фактически тоже самое, что у меня. Только запутанней )

Ну так о схожести с Вашим вариантом сообразил уже ПОСЛЕ его написания.

Меня на этот пример навела ситуация, когда удалось перегрузить CopyTicks с идентичными (как в описании) входными параметрами.

 

Вообще приведённый мной пример демонстрирует, так сказать, многоуровневый способ перегрузки - это особенно полезно в MQL, который ещё недостаточно продвинутый, чтобы делать многие перегрузки самостоятельно.  Например, если попытаться перегрузить функции с константным аргументом по ссылке и просто аргументом по ссылке, то MQL не переварит такое.  А используя данный способ, можно сделать это (правда не в глобальной видимости, а внутри класса).

 Я иногда использую 2-3 уровня наследования, на каждом отсеиваются требуемые варианты.

p.s.  Хотя не. Похоже я отстал от жизни, MQL уже умеет делать такие перегрузки )  Значит актуальность этого шаманства проходит

 
Да, хороший ООП-трюк.
 
Alexey Navoykov:
Т.е. данные хранить изначально в классах?  Ну тогда конечно вопросов бы не возникало.   А речь шла именно о нативных данных.
"Вам шашечки или ехать"? Хоть речь и шла о нативных данных, но вы же сразу упомянули шаблоны, а их обмен на виртуальный код - известный прием.
 
fxsaber:

Например, для этого.

Извините. я ошибся. У автора темы стоит совсем другая задача - отделить стандартные типы от нестандартных. Стандартные в одной функции обрабатывать, а нестандартные отдельно. А вы и не заметили, что я загнал?
 
Alexey Navoykov:

Требуется реализовать примерно такую конструкцию,  чтобы функция могла отдельно обрабатывать переменные стандартных типов, и отдельно объекты структур.  Т.е. нужна специализация шаблонной функции, либо просто сочетание шаблона и перегрузки.  Но MQL ничего этого не поддерживает, в отличие от C++.

Может у кого есть идеи, как тут выкрутиться костыльными способами?  Т.е. каким-то образом отделить структуры от остальных типов.

Формулировочка кривенькая. Функция в единственном числе. Наверно имеется ввиду, что бы было две функции. Поэтому не разберешь поймешь, кто что советует.
 
template<typename T>
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

  1. 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                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int i;
       bool b;
       Print(Assign(i,"test"));
       Print(Assign(b,"test"));
      }
    В результате выполнения данного кода мы увидим, что для пары int+string была использована шаблонная функция Assign(), а при втором вызове для пары bool+string уже использовалась перегруженная версия.
    string Assign<int,string>(int&,string)
    string Assign(bool&,string)

  2. MQL5: Добавлена возможность явной специализации шаблонных функций. Для этого перед списком параметров вызова необходимо указать параметры типизации:
    template<typename T>
    T Func() { return (T)0; }
      
      
    void OnInit()
      {
       Func<double>();   // явная специализация шаблонной функции
      }
    Таким образом, специализация происходит не через параметры вызова, а прямым указанием типов.
Причина обращения: