Я пишу функцию, которая читает постфиксное выражение в виде строки и вычисляет его соответственно.
Есть ли простой способ преобразовать символ арифметического оператора в сам арифметический оператор в C ++?
Предполагая, что это классическое упражнение по программированию 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;
}
Как говорится в комментарии @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, но довольно легко может быть переведено на C ++ 03, используя boost::function
или же std::tr1::function
)