2

さまざまな比較ステートメントが with 、withなど>で切り替えられていることを除いて、同一の 2 つの長いコード ブロックがあります。これらを関数に入れ、関数の入力に応じていずれかの演算子を使用したかったのです。<>=<=

私はMQL5でコーディングしていますが、これは C++ と非常に似ているため、これで機能するメソッドが私の場合にも使用できることを願っています。

4

3 に答える 3

3

必要な比較ごとに比較関数を作成し、適切な関数を引数として長いコード ブロック (適切に定義された関数にラップ) に渡すことができます。

myFunc例として、関数 ( ) が 2 つの整数 (aおよび) を受け取り、それらを処理する次の仮説的なケースを考えてみましょbう。引数に対して行われる比較の種類を除いて、処理手順は似ています。比較のため myFunc適切なツールを提供することで、問題を回避します。

#include <iostream>
using namespace std;

bool comp1(int a, int b) {
    return a > b;
}

bool comp2(int a, int b) {
    return a < b;
}

void myFunc(int a, int b, bool (*myComp)(int, int)) {
    bool res = myComp(a, b);
    cout << "value : " << res << endl;
}
int main()
{
    myFunc(1, 2, comp1); //use >
    myFunc(1, 2, comp2); //use <
    return 0;
}

明らかに、comp1comp2は 2 つの異なるコンパレータです。myFunc要件に応じて、そのうちの 1 つを に渡します (<または>)。

最良のことは、比較を必要なだけ複雑にすることができmyFunc、複雑さを忘れることです。

于 2014-04-26T12:17:33.677 に答える
2

関数/テンプレートへのポインターがないMQL4でのコーディング。MQL5にはテンプレートがありますが、仮パラメーターの型は組み込み型または基本的なユーザー定義型のみです。

次のようなものを試すことができます:

enum COMPARATOR
{
  C_EQUAL = 0,
  C_LESS = 1,
  C_GREATER = -1
  C_AT_MOST = 2,
  C_AT_LEAST = -2,
};

bool cmp(int a, int b, COMPARATOR c)
{
  switch (c)
  {
  case C_LESS:     return a < b;
  case C_AT_MOST:  return a <= b;
  case C_EQUAL:    return a == b;
  case C_AT_LEAST: return a >= b;
  case C_GREATER:  return a > b;
  }

  Alert("INTERNAL ERROR: UNKNOWN COMPARISON");
  return false;
}

void a_function(COMPARATOR c)
{
  if (cmp(MathRand(), 13, c))
    Print("BOOM");

  // *** If you need the "opposite" of c *** you can write:
  if (cmp(Time[0], Time[1], COMPARATOR(-c))
    Alert("DONE");
}

エレガントではありませんが、効果的です。

于 2014-05-22T16:52:11.433 に答える
1

関数またはファンクターとして「コンパレーター」を渡します。この場合、ヘッダーで定義されたstd::lessおよびstd::greaterファンクターを使用しfunctionalています。多かれ少なかれすべての演算子に対して定義されたファンクターがあります。

#include <iostream>
#include <functional>

template<typename Comparator>
void do_something(Comparator comp)
{
   int a = 1;
   int b = 2;

   if (comp(a, b)) {
      std::cout << "expression was true" << std::endl;
   } else {
      std::cout << "expression was not true" << std::endl;
   }
}

int main(int argc, char* argv[])
{
   do_something(std::greater<int>());
   do_something(std::less<int>());
}

出力:

expression was not true
expression was true
于 2014-04-26T12:34:22.577 に答える