ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 22

 
fxsaber:

спасибо!

но не разобрался как отменить макрос

вот код:

#define MACROS_PREFIX(A) FAST_##A

bool Connect(string host = "localhost", int port = 6379)
   {
   return(MACROS_PREFIX(connect)(host, port));
   }

   
   
bool FAST_connect(string host = "localhost", int port = 6379)
{
return true;
}

bool connect(string host = "localhost", int port = 6379)
{
return true;
}

сейчас работает, но с префиксом FAST_ , хочу отменить MACROS_PREFIX , но так чтобы стал был вызов connect(string host = "localhost", int port = 6379)

 
Igor Makanu:

хочу отменить MACROS_PREFIX , но так чтобы стал был вызов connect(string host = "localhost", int port = 6379)

#undef MACROS_PREFIX
#define MACROS_PREFIX(A) A
 
Igor Makanu:

спасибо!

но не разобрался как отменить макрос

вот код:

сейчас работает, но с префиксом FAST_ , хочу отменить MACROS_PREFIX , но так чтобы стал был вызов connect(string host = "localhost", int port = 6379)

#define F_CALL(dPrefix,dFunc) dPrefix##_##dFunc

void Foo()  {Alert("Null");}
void _Foo() {Foo();}
void SomePref_Foo()  {Alert("SomeFunc");}

void OnStart(){
   F_CALL(,Foo)();
   F_CALL(SomePref,Foo)();
}
 
fxsaber:

Странно, что это работает, а так - нет.

В моем макросе два параметра, а Вы передаете один, вот и ругается компилятор

 

спасибо... но все равно я не разобрался.... адова наука!!!! 

словами тут не объяснишь, попробую на языке нот

такой код работает как задумано:

bool USE_SAVE_MODE = true;                      // проверка пинга
bool ping() { return(true); }                   // заглушка 
bool connect(string h,int p) { return(true);}   // заглушка 
//+------------------------------------------------------------------+
bool ExPing()
   {
   if(USE_SAVE_MODE)
      {
      Print("safe mode on");
      return(ping());
      }
   else
      {
      Print("safe mode off");
      return(true);
      }

   }
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return ExPing() && connect(host, port);
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
      USE_SAVE_MODE = false; // отключили проверку пинга
      Connect();
   }
//+------------------------------------------------------------------+

но хочу в MQL сделать макроподстановку, чтобы минимизировать сам текст кода, так нужно:

#define  USE_FAST                               // тут нужно что-нибудь сделать!
bool connect(string h,int p)      {    }        // код 1
bool fast_connect(string h,int p) {    }        // код 2
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return connect(host, port);                  // вот тут нужен префикс и будет или connect(host, port);  или fast_connect(host, port); 
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
   }
//+------------------------------------------------------------------+
 
Vladimir Simakov:

В моем макросе два параметра, а Вы передаете один, вот и ругается компилятор

Не работает.

   F_CALL(,)
 
fxsaber:

Не работает.

Естественно. Он у тебя расширяется в _
 
Igor Makanu:

спасибо... но все равно я не разобрался.... адова наука!!!! 

словами тут не объяснишь, попробую на языке нот

такой код работает как задумано:

но хочу в MQL сделать макроподстановку, чтобы минимизировать сам текст кода, так нужно:

#define  USE_FAST                               // тут нужно что-нибудь сделать!
#ifdef USE_FAST
   #define CONNECT fast_connect
#else
   #define CONNECT connect
#endif
bool connect(string h,int p)      {    }        // код 1
bool fast_connect(string h,int p) {    }        // код 2
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return CONNECT(host, port);                  // вот тут нужен префикс и будет или connect(host, port);  или fast_connect(host, port); 
   }
//+------------------------------------------------------------------+
void OnStart()
   {
      Connect(...);
   }
//+------------------------------------------------------------------+

НО!!!

Макрос CONNECT нельзя переопределить, сделав #undef USE_FAST

 

так получатся сделать что хочу

#define  USE_FAST
bool connect(string h,int p)      { Print("On");   return true; }
bool fast_connect(string h,int p) { Print("Off");   return true;}
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   #ifdef USE_FAST
   return connect(host, port);
   #else return fast_connect(host, port);
   #endif 
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
   }
//+------------------------------------------------------------------+


интересуют варианты предложенные вчера с помощью магического заклинания #defaine абракадабра  ##_ 

UPD:

Vladimir Simakov OK, попробую разобраться

UPD:

УРА! ЗАРАБОТАЛО! (С)

#define  USE_FAST
#ifdef USE_FAST
   #define CONNECT fast_connect
#else
   #define CONNECT connect
#endif

bool connect(string h,int p)      { Print("On");   return true; }
bool fast_connect(string h,int p) { Print("Off");   return true;}
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return CONNECT(host, port);
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
   }
//+------------------------------------------------------------------+


Спасибо! все взлетело как задумано!


ЗЫ: а как бы в эту абракадабру добавить макросы __MQL5__ и __MQL4__  но так чтобы функции fast_ххх()  вообще не были в коде MQL4 никогда - от слова НИКОГДА