Variadic macros/template/function

 
Как по мне, то очень достойно со стороны разработчиков добавить было бы. Все таки С++ в основе языка, а там это с 11-го стандарта есть.
 
Vladimir Simakov:
Как по мне, то очень достойно со стороны разработчиков добавить было бы. Все таки С++ в основе языка, а там это с 11-го стандарта есть.

приведите use-case показывающий что это по крайней мере полезно и сильно облегчит жизнь простого программиста.

тут половина разработчиков знает только mql и то не шатко-ни-валко, а вы про variadic

 
Maxim Kuznetsov:

приведите use-case показывающий что это по крайней мере полезно и сильно облегчит жизнь простого программиста.

тут половина разработчиков знает только mql и то не шатко-ни-валко, а вы про variadic

Тот же самый tuple или эрзац delegate реализовать не 120-ю строками кода, а 30-ю и без ограничения на 8 параметров.

 
Vladimir Simakov:
Как по мне, то очень достойно со стороны разработчиков добавить было бы. Все таки С++ в основе языка, а там это с 11-го стандарта есть.

В принципе можно.

 
Vladimir Simakov:

Тот же самый tuple или эрзац delegate реализовать не 120-ю строками кода, а 30-ю и без ограничения на 8 параметров.

реальный пример из советника где это "вот позарез как надо"... и плюс обоснования/соображения что это частый случай.

 
Maxim Kuznetsov:

реальный пример из советника где это "вот позарез как надо"... и плюс обоснования/соображения что это частый случай.

А кому до зарезу нужны были: interface (в С++ до сих пор абстрактными классами без этого ключевого слова как-то обходятся), override (тут 70% не знает и большая часть никогда не узнает зачем это), в принципе шаблоны (причина та же, их даже в стандартной библиотеке дженериками обозвали), =delete, и т.д. А как только я прошу constexpr переменные, Variadic template, так сразу обоснуй да докажи.

#include "CArray.mqh"

#define delegate(dType,dCount) C##dType##Delegate##dCount

#define VOID_PARAM_DECL0
#define VOID_PARAM_DECL1 typename T1
#define VOID_PARAM_DECL2 VOID_PARAM_DECL1,typename T2
#define VOID_PARAM_DECL3 VOID_PARAM_DECL2,typename T3
#define VOID_PARAM_DECL4 VOID_PARAM_DECL3,typename T4
#define VOID_PARAM_DECL5 VOID_PARAM_DECL4,typename T5
#define VOID_PARAM_DECL6 VOID_PARAM_DECL5,typename T6
#define VOID_PARAM_DECL7 VOID_PARAM_DECL6,typename T7
#define VOID_PARAM_DECL8 VOID_PARAM_DECL7,typename T8

#define OUT_PARAM_DECL0 typename T
#define OUT_PARAM_DECL1 typename T,VOID_PARAM_DECL1
#define OUT_PARAM_DECL2 typename T,VOID_PARAM_DECL2
#define OUT_PARAM_DECL3 typename T,VOID_PARAM_DECL3
#define OUT_PARAM_DECL4 typename T,VOID_PARAM_DECL4
#define OUT_PARAM_DECL5 typename T,VOID_PARAM_DECL5
#define OUT_PARAM_DECL6 typename T,VOID_PARAM_DECL6
#define OUT_PARAM_DECL7 typename T,VOID_PARAM_DECL7

#define PARAM_LIST0
#define PARAM_LIST1 mParam1
#define PARAM_LIST2 PARAM_LIST1,mParam2
#define PARAM_LIST3 PARAM_LIST2,mParam3
#define PARAM_LIST4 PARAM_LIST3,mParam4
#define PARAM_LIST5 PARAM_LIST4,mParam5
#define PARAM_LIST6 PARAM_LIST5,mParam6
#define PARAM_LIST7 PARAM_LIST6,mParam7
#define PARAM_LIST8 PARAM_LIST7,mParam8

#define PARAM_INPUT0
#define PARAM_INPUT1 T1 mParam1
#define PARAM_INPUT2 PARAM_INPUT1,T2 mParam2
#define PARAM_INPUT3 PARAM_INPUT2,T3 mParam3
#define PARAM_INPUT4 PARAM_INPUT3,T4 mParam4
#define PARAM_INPUT5 PARAM_INPUT4,T5 mParam5
#define PARAM_INPUT6 PARAM_INPUT5,T6 mParam6
#define PARAM_INPUT7 PARAM_INPUT6,T7 mParam7
#define PARAM_INPUT8 PARAM_INPUT7,T8 mParam8

#define VOID_TEMPLATE_DECL(dCount) template<VOID_PARAM_DECL##dCount>
#define VOID_TEMPLATE_DECL0
#define VOID_TEMPLATE_DECL1 VOID_TEMPLATE_DECL(1)
#define VOID_TEMPLATE_DECL2 VOID_TEMPLATE_DECL(2)
#define VOID_TEMPLATE_DECL3 VOID_TEMPLATE_DECL(3)
#define VOID_TEMPLATE_DECL4 VOID_TEMPLATE_DECL(4)
#define VOID_TEMPLATE_DECL5 VOID_TEMPLATE_DECL(5)
#define VOID_TEMPLATE_DECL6 VOID_TEMPLATE_DECL(6)
#define VOID_TEMPLATE_DECL7 VOID_TEMPLATE_DECL(7)
#define VOID_TEMPLATE_DECL8 VOID_TEMPLATE_DECL(8)

#define OUT_TEMPLATE_DECL(dCount) template<OUT_PARAM_DECL##dCount>
#define OUT_TEMPLATE_DECL0 OUT_TEMPLATE_DECL(0)
#define OUT_TEMPLATE_DECL1 OUT_TEMPLATE_DECL(1)
#define OUT_TEMPLATE_DECL2 OUT_TEMPLATE_DECL(2)
#define OUT_TEMPLATE_DECL3 OUT_TEMPLATE_DECL(3)
#define OUT_TEMPLATE_DECL4 OUT_TEMPLATE_DECL(4)
#define OUT_TEMPLATE_DECL5 OUT_TEMPLATE_DECL(5)
#define OUT_TEMPLATE_DECL6 OUT_TEMPLATE_DECL(6)
#define OUT_TEMPLATE_DECL7 OUT_TEMPLATE_DECL(7)

#define OUT_TYPEOUT T
#define OUT_TYPEVOID void

#define INVOKEVOID(dCount) for (int i=0,count=cInvokeList.GetSize();i<count;cInvokeList[i++](PARAM_LIST##dCount));}
#define INVOKEOUT(dCount) \
      T res=NULL; \
      for (int i=0,count=cInvokeList.GetSize();i<count;res=cInvokeList[i++](PARAM_LIST##dCount));  \
      return res;}

#define DELEGATE_DECL(dType,dCount) \
   dType##_TEMPLATE_DECL##dCount   \
   class C##dType##Delegate##dCount{  \
      typedef OUT_TYPE##dType (*InvokeDelegateFunction)(PARAM_INPUT##dCount); \
      CArray<InvokeDelegateFunction>  cInvokeList; \
   public:  \
      void operator =(InvokeDelegateFunction mInvokeFunction) {if (cInvokeList.IsEmpty()) cInvokeList.PushBack(mInvokeFunction);    \
                                                               else {cInvokeList.Set(mInvokeFunction,0); cInvokeList.Resize(1);}} \
      void operator +=(InvokeDelegateFunction mInvokeFunction) {cInvokeList.PushBack(mInvokeFunction);}  \
      void operator -=(InvokeDelegateFunction mInvokeFunction);   \
      int Find(InvokeDelegateFunction mInvokeFunction){  \
        for (int i=0,count=cInvokeList.GetSize();i<count;++i) if (cInvokeList[i]==mInvokeFunction) return i;   \
        return -1;}  \
      OUT_TYPE##dType   Invoke(PARAM_INPUT##dCount);  \
   }; \
   dType##_##TEMPLATE_DECL##dCount   \
   void C##dType##Delegate##dCount::operator -=(InvokeDelegateFunction mInvokeFunction){ \
      for (int i=cInvokeList.GetSize()-1;i>=0;--i) \
         if (cInvokeList[i]==mInvokeFunction){  \
            cInvokeList.Delete(i);  \
            break;}} \
   dType##_##TEMPLATE_DECL##dCount   \
   OUT_TYPE##dType C##dType##Delegate##dCount::Invoke(PARAM_INPUT##dCount){   \
      INVOKE##dType(dCount)

DELEGATE_DECL(VOID,0)
DELEGATE_DECL(VOID,1)
DELEGATE_DECL(VOID,2)
DELEGATE_DECL(VOID,3)
DELEGATE_DECL(VOID,4)
DELEGATE_DECL(VOID,5)
DELEGATE_DECL(VOID,6)
DELEGATE_DECL(VOID,7)
DELEGATE_DECL(VOID,8)
DELEGATE_DECL(OUT,0)
DELEGATE_DECL(OUT,1)
DELEGATE_DECL(OUT,2)
DELEGATE_DECL(OUT,3)
DELEGATE_DECL(OUT,4)
DELEGATE_DECL(OUT,5)
DELEGATE_DECL(OUT,6)
DELEGATE_DECL(OUT,7)

Вот причина. Вам нравится? А меня от этого кода тошнит, но приходится так писать, потому, что по другому нельзя, надо ведь сначала доказать, зачем это нужно. И кортеж такой же "страшный" получился.

 
Vladimir Simakov:

1. А кому до зарезу нужны были: interface (в С++ до сих пор абстрактными классами без этого ключевого слова как-то обходятся), override (тут 70% не знает и большая часть никогда не узнает зачем это), в принципе шаблоны (причина та же, их даже в стандартной библиотеке дженериками обозвали), =delete, и т.д. А как только я прошу constexpr переменные, Variadic template, так сразу обоснуй да докажи.

2. Вот причина. Вам нравится? А меня от этого кода тошнит, но приходится так писать, потому, что по другому нельзя, надо ведь сначала доказать, зачем это нужно. И кортеж такой же "страшный" получился.

1. А вы сами-то знаете, зачем нужны интерфейсы. Очень яркое и устойчивое впечатление, что вы сами этого не знаете. Кому оно могли быть нужно позарез, разве что тому, кто до сих пор не понял что это и зачем оно нужно.

2. Это потрясающе! И кто же вас заставляет писать такое, когда задача решается в две строки? 

 
Вообще умиляют такие товарищи, позиционирующие себя мега супер крутыми цыпэпэ программистами, но с потребностями фич из языков для детсадников. 
 
Dmitry Fedoseev:

1. А вы сами-то знаете, зачем нужны интерфейсы. Очень яркое и устойчивое впечатление, что вы сами этого не знаете. Кому оно могли быть нужно позарез, разве что тому, кто до сих пор не понял что это и зачем оно нужно.

2. Это потрясающе! И кто же вас заставляет писать такое, когда задача решается в две строки? 

class Interfase
  {
public:
   virtual void   Method1()=0;
   virtual double   Method2(int,string)=0;
  };

Это по первому пункту. Именно этим и является interface

По второму пункту - покажи код, а остальные сравнят

 
Vladimir Simakov:

А кому до зарезу нужны были: interface (в С++ до сих пор абстрактными классами без этого ключевого слова как-то обходятся), override (тут 70% не знает и большая часть никогда не узнает зачем это), в принципе шаблоны (причина та же, их даже в стандартной библиотеке дженериками обозвали), =delete, и т.д. А как только я прошу constexpr переменные, Variadic template, так сразу обоснуй да докажи.

Вот причина. Вам нравится? А меня от этого кода тошнит, но приходится так писать, потому, что по другому нельзя, надо ведь сначала доказать, зачем это нужно. И кортеж такой же "страшный" получился.

я извиняюсь! скажите а какие функции выполняет этот код? куда его можно применить?  

 
Aleksandr Klapatyuk:

я извиняюсь! скажите а какие функции выполняет этот код? куда его можно применить?  

это вопрос на грани "покажи стейт с реала" :-)