4

我正在编写一个函数,它以字符串的形式读取后缀表达式并相应地计算它。

有没有一种简单的方法可以将算术运算符的字符转换为 C++ 中的算术运算符本身?

4

2 回答 2

10

正如@chris 的评论所说,您可以创建一个字符映射到函子:

std::map<char, std::function<double(double,double)> operators{
  { '+', std::plus<double>{} },
  { '-', std::minus<double>{} },
  { '*', std::multiplies<double>{} },
  { '/', std::divides<double>{} }
};

double apply(double lhs, double rhs, char op)
{
  return operators[op](lhs, rhs);
}

std::bad_function_call如果您使用不代表已知运算符的字符调用函数,则会抛出此错误。

它还会在地图中为此类未知字符创建不需要的条目,以避免您使它变得更加复杂:

double apply(double lhs, double rhs, char op)
{
  auto iter = operators.find(op);
  if (iter == operators.end())
    throw std::bad_function_call();
  return (*iter)(lhs, rhs);
}

(注意这使用 C++11 的特性,但可以很容易地转换为 C++03,使用boost::functionor std::tr1::function

于 2012-10-28T00:46:08.920 回答
9

假设这是针对经典的 RPN 编程练习,最简单的解决方案是使用switch语句:

char op = ...    
int lhs = ...
int rhs = ...
int res = 0;
switch(op) {
    case '+':
        res = lhs + rhs;
    break;
    case '-':
        res = lhs - rhs;
    break;
    case '*':
        res = lhs * rhs;
    break;
    case '/':
        res = lhs / rhs;
    break;
    case '%':
        res = lhs % rhs;
    break;
}
于 2012-10-28T00:35:44.437 回答