ну да, тут в общем я толком не использую все модификаторы, поэтому это и вызвало мое восхищение, проверил, теперь обфусцировал код, хотя хотел просто записать компактно )))
Моя реализация конструкции for each средствами MQL.
Пока работает только для массивов: 1) штатные mql-массивы; 2) пользовательские классы массивов, у которых должен быть определён оператор [](int), а также перегружена глобальная функция ArraySize.
Синтаксис:
foreach(element_var, array) { ... }
Массив может быть задан как переменной, так и выражением - именно из-за этого и пришлось городить огород ) Выражение выполняется однократно, сохраняя указатель на массив, и затем производится доступ по этому указателю.
Моя реализация конструкции for each средствами MQL.
Пока работает только для массивов: 1) штатные mql-массивы; 2) пользовательские классы массивов, у которых должен быть определён оператор [](int), а также перегружена глобальная функция ArraySize.
Классно вышло! Возможно ли сделать такой вариант?
voidOnStart()
{
MqlTick Ticks[3];
for (int i = 0; i < ArraySize(Ticks); i++)
Ticks[i].bid = i + 1;
foreach(MqlTick Tick, Ticks) Print(Tick.bid); // OK
foreach(MqlTick Tick[1], Ticks) ArrayPrint(Tick); // 'Tick' - invalid array access
}
Да, действительно. Начав разбираться, я открыл для себя интересную особенность. При передаче в шаблон аргумента константного типа (например const int) внутри шаблона он воспринимается просто как: T = int, однако и константность тоже каким-то образом учитывается, что сбивает с толку:
template<typename T>
class B { };
template<typename T>
void f(T & a)
{
B<const T> b; // OK. Значит T==int
const T arr[]={}; // Тоже всё ОК.
T arr2[]; // 'arr2' - 'const' variable must be initialized. wtf?
}
voidOnStart()
{
constint a=0;
f(a);
}
Сначала подумал, это особенность MQL, но и в C++ так же.
// Некоторые возможности структур, которых нет у классов.хм, интересно, очень с const полями понравилась идея, const будут инициализированы всего один раз
хм, интересно, очень с const полями понравилась идея, const будут инициализированы всего один раз
можно теперь так сделать нормализацию лота:
В классах тоже можно константные члены объявлять.
В классах тоже можно константные члены объявлять.
ну да, тут в общем я толком не использую все модификаторы, поэтому это и вызвало мое восхищение, проверил, теперь обфусцировал код, хотя хотел просто записать компактно )))
ЗЫ: фолдинга в МЕ жесть как не хватает! - напрягает колесиком мыши тудымсюдым крутить (((Моя реализация конструкции for each средствами MQL.
Пока работает только для массивов: 1) штатные mql-массивы; 2) пользовательские классы массивов, у которых должен быть определён оператор [](int), а также перегружена глобальная функция ArraySize.
Синтаксис:
foreach(element_var, array) { ... }Массив может быть задан как переменной, так и выражением - именно из-за этого и пришлось городить огород ) Выражение выполняется однократно, сохраняя указатель на массив, и затем производится доступ по этому указателю.
Примеры использования:
Примеры использования:
Немного переписал
Моя реализация конструкции for each средствами MQL.
Пока работает только для массивов: 1) штатные mql-массивы; 2) пользовательские классы массивов, у которых должен быть определён оператор [](int), а также перегружена глобальная функция ArraySize.
Классно вышло! Возможно ли сделать такой вариант?
Классно вышло! Возможно ли сделать такой вариант?
foreach(Ticks[0], Ticks) ArrayPrint(Ticks[0].bid);Ну инициализация массива переменными не поддерживается в MQL. Можно сделать присваивание элементу массива:
В реализации не разобрался, но так делать не вижу смысла.
Такой вариант не работает
Такой вариант не работает
Сначала подумал, это особенность MQL, но и в C++ так же.
Сначала подумал, это особенность MQL, но и в C++ так же.
потому что тип const int. просто в шаблоне к нему все равно без проблем можно пришпилить const спереди
но если в c++ можно нехитрыми манипуляциями убрать const у типа, то в mql этого сделать нельзя