#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

class Server {
private:
	using erasedType = void (*)();
	unordered_map<string, erasedType> funcs;
public:
	template<typename... Args>
	void Register(const string& name, void (*func)(Args...)) {
		funcs[name] = reinterpret_cast<erasedType>(func);
	}
	
	template<typename... Args>
	void Call(const string& name, Args... args) {
		using funcType = void (*)(Args...);
		auto func = reinterpret_cast<funcType>(funcs.at(name));
		return func(args...);
	}
};

int main() {
	Server server;
	server.Register("Add", +[](int a, int b){ cout << a+b << endl; });
	server.Register("Echo", +[](string str){ cout << str << endl; });
	
    server.Call("Add", 12, 13);
    server.Call("Echo", string("hello"));

	return 0;
}