如何在枚举器上定义运算符?

时间:2014-10-25 23:06:23

标签: c++ enumeration

我有一个枚举器

enum oper {PLUS, MINUS, TIMES, DIVIDE, EXP};

我用它来构造数学函数的树。在我定义的方式中,enum按优先级的升序排列。所以我希望能够做到这样的事情:

oper op1 = PLUS; 
oper op2 = DIVIDE; 
std::cout << (op1 < op2); // should print out "1"

如果可能,如果可能,如何构建定义运算符的函数?

我知道这是基本C++的东西。我需要记住他的记忆。 ;)

1 个答案:

答案 0 :(得分:0)

如果您在引入新运营商时可以重新订购,例如ANDORNOT等,然后您可以确保从最低到最高订购运营商,标准operator<就可以了。

如果您仍想要自定义运算符,例如因为您需要能够添加更多运算符并仍然保持与其他模块或其他模块的二进制兼容性,然后执行以下操作:

#include <iostream>

enum oper { PLUS, MINUS, TIMES, DIVIDE, EXP, MAX_OPER };

bool operator<(oper a, oper b)
{
    int pri[MAX_OPER] = { 5, 1, 2, 3, 4 };

    return pri[a] < pri[b];
}


int main()
{
    oper op1 = PLUSS; 
    oper op2 = DIVIDES; 
    std::cout << (op1 < op2);
}

将起作用(请注意,此特定示例将使输出为0,因为我重新排列了pri表,只是为了显示除了枚举的默认operator<以外的其他内容。

我更喜欢通过制作这样的函数让你更明显地做些什么:

bool isSecondOperHigher(oper left, oper right)
{
   bool result;
   ... do some stuff to come up with result here ... 
   return result; 
}

(对operator< enum oper而言,{{1}}给出的优先级较低,并不总是显而易见的。