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

Artyom Trishkin
Модератор
47728
Artyom Trishkin  

Прошу не замусоривать тему - она про особенности, а не о том как всё криво и безобразно.

Нашли особенность - решили - поделились - народ благодарен.

Свои мнения об убогости и недоразвитости - в интересное и юмор пожалуйста.

Alexey Navoykov
4487
Alexey Navoykov  
Artyom Trishkin:

Прошу не замусоривать тему - она про особенности, а не о том как всё криво и безобразно.

Нашли особенность - решили - поделились - народ благодарен.

Свои мнения об убогости и недоразвитости - в интересное и юмор пожалуйста.

Ок, прошу прощения, если моя формулировка прозвучала грубо.  Я не имел ввиду убогость. А подразумевал недоразвитость в прямом смысле - недостаток некоторого функционала.  В частности, например, множественные интерфейсы, которые разработчики обещают уже несколько лет.
Ilya Malev
12328
Ilya Malev  

Не помню, было здесь или нет, но может кому пригодиться. Когда нужно перегрузить метод параметризированного класса только по тому признаку, принимает он аргумент одного и того же типа по значению, или по ссылке (структуры передаются только по ссылке, простые типы чаще всего по значению). Это можно сделать таким способом (причем, второй 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; 
 }

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

Alexey Navoykov
4487
Alexey Navoykov  
Ilya Malev:

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

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

Ilya Malev
12328
Ilya Malev  
Alexey Navoykov:

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

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

Alexey Navoykov
4487
Alexey Navoykov  
Ilya Malev:

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

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

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

Ilya Malev
12328
Ilya Malev  
Alexey Navoykov:

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

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

Alexey Navoykov:

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

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

Alexey Navoykov
4487
Alexey Navoykov  
Ilya Malev:

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

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

Ilya Malev:

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

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

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

iSAR iOsMA EA - Trailing