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