mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 22

 
Igor Makanu:

MACROS_PREFIXをオーバーライドしてconnect(string host = "localhost", int port = 6379)を呼び出したい ですが。

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

ありがとうございました。

しかし、マクロをオーバーライドする方法がわかっていません。

以下はそのコードです。

それは今では動作しますが、接頭辞FAST_で、私はMACROS_PREFIXをオーバーライドしたいですが、その接続(文字列 ホスト= "localhost", int ポート= 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:

うまくいくようでいて、うまくいかないのが不思議です。

私のマクロには2つのパラメータがありますが、1つを渡すと、コンパイラは悪態をつきます。

 

あんがとが、まだわからない...。地獄の科学!!!!

言葉で説明できないので、ノート語でやってみます。

このコードは意図したとおりに動作します。

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:

私のマクロには2つのパラメータがあり、あなたは1つのパラメータを渡しています。

うまくいかないんです。

   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 abracadabra##_

UPDです。

Vladimir Simakov わかりました、やってみます。

UPDです。

HOORAY!IT WORKED!(С)

#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();
   }
//+------------------------------------------------------------------+


ありがとうございます!意図したとおりに離陸しました。


PZY: このアブラカタブラに __MQL5__ と __MQL4__ マクロをどう追加すればいいのか、しかし fast_xxx() 関数は MQL4 コードには一切存在しない - NEVER という言葉から。

 
Igor Makanu:

だから、自分の好きなようにできるんです。


昨日、魔法の呪文で提案されたオプションに興味がある #defaine abracadabra##_

UPDです。

Vladimir Simakov わかりました、やってみます。

イゴール・マカヌ

さもなくば


昨日提案された、魔法の呪文「デファイン・アブラカダブラ」を使ったバリエーションに興味津々##_

UPDです。

Vladimir Simakov わかりました、何とかしてみます。

UPDです。

HOORAY!IT WORKED!(С)


ありがとうございます!意図したとおりに離陸しました。


PZY: このアブラカタブラに __MQL5__ と __MQL4__ マクロをどう追加すればいいのか、しかし fast_xxx() 関数は MQL4 コードにはまったく存在しない - NEVER という言葉から。

UPDです。

HOORAY!IT WORKED!(С)


ありがとうございます!予定通り飛び立ちました。


PZY: このアブラカタブラに __MQL5__ と __MQL4__ マクロをどう追加すればいいのか、しかし fast_xxx() 関数は MQL4 コードにまったく登場しない - NEVER という言葉から。

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