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