文字列の形式で後置式を読み取り、それに応じて計算する関数を作成しています。
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);
}
boost::function
(NB これは C++11 の機能を使用していますが、またはを使用して C++03 に簡単に変換できます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;
}