如何将'+'转换为+,'*'转换为*等

时间:2012-10-28 00:30:47

标签: c++ parsing postfix-notation

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

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

2 个答案:

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

(N.B。这使用C ++ 11功能,但可以很容易地使用boost::functionstd::tr1::function转换为C ++ 03

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