我怎样才能使用<或者> (或其他比较运算符)在表达式中取决于函数输入?

时间:2014-04-26 12:11:31

标签: comparison metatrader4 mql5 metatrader5

我有两个冗长的代码块,除了各种比较语句外,><>=<=切换等。我想把这些在函数中,根据函数输入使用一个或另一个操作符。

我在MQL5编码,但这与C ++非常相似,所以希望在我的情况下使用的方法也是可用的。

3 个答案:

答案 0 :(得分:3)

您可以为所需的每个比较创建一个比较器函数,然后将正确的函数作为参数传递给 longish 代码块(包含在一个适当定义的函数中)

作为示例,请考虑以下假设情况,其中函数(myFunc)接收2个整数(ab) 并处理它们。除了对参数进行的比较类型之外,处理步骤类似。我们通过为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是两种不同的比较器。我们会将其中一个传递给myFunc,具体取决于要求(<>)。

最好的事情是,你的比较现在可以像你想要的那样复杂,而myFunc则无视复杂性。

答案 1 :(得分: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");
}

它不优雅,但它有效。

答案 2 :(得分:1)

将“比较器”作为函数或函子传递,在这种情况下,我使用std::less标题中定义的std::greaterfunctional仿函数,定义了仿函数或多或少所有的运营商。

#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