#include <iostream>
#include <unordered_map>
#include <string>
#include <cmath>
using namespace std;
class Calculator {
private:
typedef double (*FuncType)(double, double);
static unordered_map<string, FuncType> operator_function;
static double multiply(double num_1, double num_2) {
cout << "MULTIPLYING!" << endl;
return num_1 * num_2;
}
static double exponent(double num_1, double num_2) {
cout << "EXPONENT!" << endl;
return pow(num_1, num_2);
}
public:
static double do_math(string op, double num_1, double num_2) {
FuncType func = operator_function[op];
return func(num_1, num_2);
}
};
unordered_map<string, Calculator::FuncType> Calculator::operator_function = {
{"*", &Calculator::multiply},
{"^", &Calculator::exponent},
{"**", &Calculator::exponent}
// and so on ...
};
int main() {
cout << Calculator::do_math("*", 123, 45) << endl;
cout << Calculator::do_math("^", 123, 2) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNtYXRoPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ2FsY3VsYXRvciB7CnByaXZhdGU6CiAgICB0eXBlZGVmIGRvdWJsZSAoKkZ1bmNUeXBlKShkb3VibGUsIGRvdWJsZSk7CgogICAgc3RhdGljIHVub3JkZXJlZF9tYXA8c3RyaW5nLCBGdW5jVHlwZT4gb3BlcmF0b3JfZnVuY3Rpb247CgogICAgc3RhdGljIGRvdWJsZSBtdWx0aXBseShkb3VibGUgbnVtXzEsIGRvdWJsZSBudW1fMikgewogICAgICAgIGNvdXQgPDwgIk1VTFRJUExZSU5HISIgPDwgZW5kbDsKICAgICAgICByZXR1cm4gbnVtXzEgKiBudW1fMjsKICAgIH0KCiAgICBzdGF0aWMgZG91YmxlIGV4cG9uZW50KGRvdWJsZSBudW1fMSwgZG91YmxlIG51bV8yKSB7CiAgICAgICAgY291dCA8PCAiRVhQT05FTlQhIiA8PCBlbmRsOwogICAgICAgIHJldHVybiBwb3cobnVtXzEsIG51bV8yKTsKICAgIH0KCnB1YmxpYzoKICAgIHN0YXRpYyBkb3VibGUgZG9fbWF0aChzdHJpbmcgb3AsIGRvdWJsZSBudW1fMSwgZG91YmxlIG51bV8yKSB7CiAgICAgICAgRnVuY1R5cGUgZnVuYyA9IG9wZXJhdG9yX2Z1bmN0aW9uW29wXTsKICAgICAgICByZXR1cm4gZnVuYyhudW1fMSwgbnVtXzIpOwogICAgfQp9OwoKdW5vcmRlcmVkX21hcDxzdHJpbmcsIENhbGN1bGF0b3I6OkZ1bmNUeXBlPiBDYWxjdWxhdG9yOjpvcGVyYXRvcl9mdW5jdGlvbiA9IHsKICAgIHsiKiIsICAmQ2FsY3VsYXRvcjo6bXVsdGlwbHl9LAogICAgeyJeIiwgICZDYWxjdWxhdG9yOjpleHBvbmVudH0sCiAgICB7IioqIiwgJkNhbGN1bGF0b3I6OmV4cG9uZW50fQogICAgLy8gYW5kIHNvIG9uIC4uLgp9OwoKaW50IG1haW4oKSB7Cgljb3V0IDw8IENhbGN1bGF0b3I6OmRvX21hdGgoIioiLCAxMjMsIDQ1KSA8PCBlbmRsOwoJY291dCA8PCBDYWxjdWxhdG9yOjpkb19tYXRoKCJeIiwgMTIzLCAyKSA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=