Особенности языка mql5, тонкости и приёмы работы - страница 124

 
Комментарии, не относящиеся к этой теме, были перенесены в "ООП, шаблоны, макросы в mql5, тонкости и приёмы использования".
 

Не помню, было здесь или нет, но может кому пригодиться. Когда нужно перегрузить метод параметризированного класса только по тому признаку, принимает он аргумент одного и того же типа по значению, или по ссылке (структуры передаются только по ссылке, простые типы чаще всего по значению). Это можно сделать таким способом (причем, второй template именно применять к варианту без &, иначе основная типизация по структурам не станет компилироваться)

template<typename T>
class A
 {
public:
  A* operator<<(T&p){ Print("<< &",typename(T)); return &this; }
  template<typename F>
  A* operator<<(F p){ Print("<< ",typename(F)); return &this; }
 };

void OnStart()
 {
    double ask=Ask,bid=Bid;
    MqlTick mt;
    A<double> a1;
    a1<<Ask<<Bid<<ask;
    A<MqlTick> a2;
    a2<<mt; 
 }

Обсуждение здесь.

 
Ilya Malev:

Не помню, было здесь или нет, но может кому пригодиться. Когда нужно перегрузить метод параметризированного класса только по тому признаку, принимает он аргумент одного и того же типа по значению, или по ссылке (структуры передаются только по ссылке, простые типы чаще всего по значению). Это можно сделать таким способом (причем, второй template именно применять к варианту без &, иначе основная типизация по структурам не станет компилироваться)

Тогда получается, что класс, предназначенный для типа структуры, может принимать всякие числовые типы. И что с ними делать?

 
Alexey Navoykov:

Тогда получается, что класс, предназначенный для типа структуры, может принимать всякие числовые типы. И что с ними делать?

В данном случае класс предназначен для смешанного типа - и для структур и для простых типов, иначе эта конструкция лишена смысла. Чтобы не принимать не нужные типы в F, можно там написать проверку на typename(F), sizeof(F) и т.п.

 
Ilya Malev:

В данном случае класс предназначен для смешанного типа - и для структур и для простых типов, иначе эта конструкция лишена смысла. Чтобы не принимать не нужные типы в F, можно там написать проверку на typename(F), sizeof(F) и т.п.

typename не защитит от приёма ненужных типов )  Для этого нужно делать перегруженный приватный метод с соответствующим типом.

А если класс предназначен для любых типов, то зачем его параметризовать шаблонным параметром, создавая путаницу?   Если только в костыле такое использовать.  Хотя для костыля есть более простые варианты, без шаблонных классов.

 
Alexey Navoykov:

 если класс предназначен для любых типов, то зачем его параметризовать шаблонным параметром, создавая путаницу? 

Так как Вы примите нужный тип, который может быть любым, не совершая параметризации? Нельзя ведь объявить параметр или поле без указания типа. Например, это может быть класс-"обертка" на произвольный тип данных.

Alexey Navoykov:

typename не защитит от приёма ненужных типов )

Если написать typename(F)==typename(T), то защитит.

 
Ilya Malev:

Так как Вы примите нужный тип, который может быть любым, не совершая параметризации? Нельзя ведь объявить параметр или поле без указания типа. Например, это может быть класс-"обертка" на произвольный тип данных.

Ну тогда это просто класс A.  Зачем объявлять шаблон, если его параметр по смыслу никак не связан с поведением класса?

Ilya Malev:

Если написать typename(F)==typename(T), то защитит.

Это уж совсем жесть. Переносить типоконтроль на стадию выполнения... Ваши коды придётся годами потом отлаживать

 
Подскажите, пожалуйста, где можно подсмотреть обычный трейлинг стоп для пятерки?
 
Nikita Chernyshov:
Подскажите, пожалуйста, где можно подсмотреть обычный трейлинг стоп для пятерки?

iSAR iOsMA EA - Trailing

 
Vladimir Karputov:

iSAR iOsMA EA - Trailing

Спасибо!

Причина обращения: