#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;
}