首页 文章

如何根据函数输入在表达式中使用<或>(或其他比较运算符)?

提问于
浏览
2

我有两个长的代码块,除了各种比较语句之外都是相同的 ><>=<= 等切换 . 我想把它们放在一个函数中,根据函数输入使用一个或另一个运算符 .

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

3 回答

  • 3

    传入"comparator"作为函数或函子,在这种情况下,我使用的是functional头中定义的std::lessstd::greater仿函数,为所有运算符或多或少定义了仿函数 .

    #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
    
  • 2

    您可以为所需的每个比较创建一个比较器函数,然后将右函数作为参数传递给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

    编码MQL4你没有指向函数/模板的指针 . MQL5有模板,但形式参数类型是 only built-in or basic user-defined types .

    你可以尝试类似的东西:

    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");
    }
    

    它不优雅但有效 .

相关问题