2012-10-28 136 views
4

我在写一个函数,它以字符串的形式读取后缀表达式并相应地计算它。如何将'+'转换为+,'*'为*等

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

+7

根据您支持的操作符的数量,您可能希望将每个字符映射到函数,如'std :: plus'。 – chris

+0

我支持'+',' - ','*'和'/'。 –

回答

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; 
} 
+0

非常感谢您的帮助。我想确保在该语言中没有可用的算术转换。 –

+7

@DerekW:不,C++不包括(在标准中)任何类型的表达式评估器。 C++中的运算符由编译器解析,并且在运行时没有它们的概念。 –

+0

谢谢澄清。 –

10

由于@克里斯评论说,你可以制作一张人物函子:

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

它也将在地图上对这种未知字符创建不必要的项目,以避免你可以把它稍微complciated:

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); 
} 

(NB它使用C++ 11层的功能,但可以很容易地被翻译为C++ 03,使用boost::functionstd::tr1::function