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