Как конвертировать ‘+’ в +, ‘*’ в * и т. Д.

Я пишу функцию, которая читает постфиксное выражение в виде строки и вычисляет его соответственно.

Есть ли простой способ преобразовать символ арифметического оператора в сам арифметический оператор в C ++?

4

Решение

Предполагая, что это классическое упражнение по программированию 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;
}
9

Другие решения

Как говорится в комментарии @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)

10

По вопросам рекламы [email protected]