Обсуждение статьи "LifeHack для трейдера: замешиваем ForEach на дефайнах (#define)" - страница 3

 
fxsaber:

Он с изъяном (для структур облом) и не оптимальный.

Если уж делать с изъяном, то как по мне в другую сторону. Тоже с изъяном, тоже неоптимальный, но так по мне удобнее.

#define ForEach(type, element, array)                             \
for (int __i = 0, __max = ArraySize((array)); __i < __max; __i++) \
{                                                                 \
type element = array[__i];                                        \

void OnStart()
{
   string array[] = {"12", "23", "34", "45"};
   
   ForEach(string, item, array)
      Print(item);
   }
}
 
Комбинатор:

Если уж делать с изъяном, то как по мне в другую сторону. Тоже с изъяном, тоже неоптимальный, но так по мне удобнее.

Да, с типом, похоже, никак не выкрутиться. Со структурой выкрутиться из предыдущего можно так

template <typename T>
bool Assign( const T &Value1, T &Value2 )
{
  Value2 = Value1;
  
  return(true);
}

#define forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && Assign(array[__i], element); __i++)

Недорешение, короче. Тем более, что forEach - только на чтение массива, без записи.

 

тУТ похоже, работа ради работы... :-) 

Золотые слова:

"Сам я рассматриваю приведенные в статье приемы именно как лайфхак и остаюсь приверженцем классического MQL5-подхода. Возможно, тем, кто привык писать в MQL4-стиле, эти статьи помогут преодолеть психологический барьер при переходе на платформу MetaTrader 5, которая по всем параметрам гораздо удобнее."

 
Roman Shiredchenko:

тУТ похоже, работа ради работы... :-) 

Золотые слова:

"Сам я рассматриваю приведенные в статье приемы именно как лайфхак и остаюсь приверженцем классического MQL5-подхода. Возможно, тем, кто привык писать в MQL4-стиле, эти статьи помогут преодолеть психологический барьер при переходе на платформу MetaTrader 5, которая по всем параметрам гораздо удобнее."

Уверен, это нормально, когда есть люди, готовые писать в три раза больше кода при одинаковом результате.

 
Чтобы добить forEach, нужно использовать ##  в макросе, дабы иметь возможность использовать вложенные forEach.
 
Комбинатор:

Если уж делать с изъяном, то как по мне в другую сторону. Тоже с изъяном, тоже неоптимальный, но так по мне удобнее.

Вы продемонстрировали один из недостатков макросов.

То что в нём можно поставить одну скобку, а вторую нужно не забыть поставить снаружи.

Не делайте так никогда!

 
Koldun Zloy:

Вы продемонстрировали один из недостатков макросов.

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

Я же прямо сказал, хорошей версии нет и в текущих реалиях быть не может.

 
Комбинатор:

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

Я же прямо сказал, хорошей версии нет и в текущих реалиях быть не может.

По-моему, это хорошая версия

#define ForEach(Index, array) for (int Index = 0, max##Index = ArraySize((array)); Index < max##Index; Index++) 

void OnStart()
{
  string array[] = {"12", "23", "34", "45"};
  
  ForEach(i, array)
  {
   Print(array[i]);
   
   ForEach(j, array)
     Print(array[j]);
  }    
}
 
fxsaber:

По-моему, это хорошая версия

да, вполне
 
fxsaber:

По-моему, это хорошая версия

Вложенный ForEach - это чтобы показать, что нет коллизий. Верно?