我正在编写一个以字符串形式读取后缀表达式的函数,并相应地计算它。
有没有一种简单的方法可以将算术运算符的字符转换为C ++中的算术运算符本身?
答案 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::function
或std::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;
}