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

 
Alexey Navoykov:
Кстати я пришёл к выводу, что в общем случае, если тип возвращаемого значения функции будет абсолютно любым, то задача не решаема средствами MQL.  Требуется decltype, которого здесь нет.

Указатель вернет, а вот структуру - не думал. Все таки там по ссылке должно быть.

 
fxsaber:

Так то же самое

Теперь вообще 2 аргумента передаётся в функцию вместо 3 :

MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)
 
Alexey Navoykov:

Теперь вообще 2 аргумента передаётся в функцию вместо 3 :

Два - это абсолютно исходная задача. А три - ее обобщение

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.12.21 22:15

Уточню, что NewHandle - может быть константой. Т.е. валидный такой вызов
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.
По примерам, вроде, понятно, что требуется от макроса.
 

Вообще конечно закладываться на порядок вычисления аргументов - сомнительная затея.  В стандарте C++ этот порядок не определён, отдан на откуп компилятора. А как с этим обстоит в MQL - нужно прояснить у разработчиков, может ли этот порядок меняться, или не планируют ли его менять в будущем.

Поэтому лучше такой вариант:

template <typename T1, typename T2>
T2 MacrosFunc( const T1 handle, const T2 Value )
{
  SelectHandle(Memory(handle, false));
  return(Value);
}

#define MACROS(A, B) MacrosFunc(A,  SelectHandle(Memory(A)) ? (B) : NULL)
 
Alexey Navoykov:

Вообще конечно закладываться на порядок вычисления аргументов - сомнительная затея.  В стандарте C++ этот порядок не определён, отдан на откуп компилятора. А как с этим обстоит в MQL - нужно прояснить у разработчиков, может ли этот порядок меняться, или не планируют ли его менять в будущем.

Поэтому лучше такой вариант:

Да, так надежней.

 

Я хренею, дорогая редакция. 

Отдавать код интерпретатору, не понимая, как он этот код истолкует... Высокие отношения. 

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.12.21 10:23

Не могу сообразить, прошу подсказать. Есть такое получение времени

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


Как написать макрос, делающий то же самое

time = MACROS(NewHandle, TimeCurrent()); // Макрос


Проблема в том, что PrevHandle в макросе не создать.

Не понимаю, чем хуже моё решение, вставлю и его сюда:

//handle_t MACROS_helper_PrevHandle;
int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)

Примечательно - реализация оператор запятая через тренарный оператор (ну ничего генального, но впервые столкнулся).

Непонятно - к чему протаскивать тип хендла через шаблон? Неужели будут разные типы хендлов, да ерунда ведь. А тип хендла в общем случае будет задан через typedef/define.

 
pavlick_:

Не понимаю, чем хуже моё решение, вставлю и его сюда:

Примечательно - реализация оператор запятая через тренарный оператор (ну ничего генального, но впервые столкнулся).

Непонятно - к чему протаскивать тип хендла через шаблон? Неужели будут разные типы хендлов, да ерунда ведь. А тип хендла в общем случае будет задан через typedef/define.

Совсем все плохо. Что такое handle? 

 
Алексей Тарабанов:

Совсем все плохо. Что такое handle? 

Условие задачи было задачи: есть некое окружение, которое меняется через описатель (handle), и нужно в одном макросе реализовать:

1. Запомнить текущий handle

2. Переключить окружение на новый handle

3. Получить из окружения нужный параметр

4. Переключить окружение на старый handle

5. Вернуть параметр

 
pavlick_:

Условие задачи было задачи: есть некое окружение, которое меняется через описатель (handle), и нужно в одном макросе реализовать:

1. Запомнить текущий handle

2. Переключить окружение на новый handle

3. Получить из окружения нужный параметр

4. Переключить окружение на старый handle

5. Вернуть параметр

Спасибо за ответ. 

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