#pragma once #include #include #include #include #include class RpcInvoker { public: template void registerMethod(Obj* instance, const std::string& name, Ret (Obj::*method)(Args...)) { handlers[name] = [instance, method](const IpcMessage& req) -> IpcMessage { IpcMessage msg = req; // пропустить имя метода (void)msg.template get(); // читать аргументы и вызвать метод return callMethod(instance, method, msg); }; } IpcMessage dispatch(const IpcMessage& request) { IpcMessage tmp = request; const std::string method = tmp.get(); auto it = handlers.find(method); if (it == handlers.end()) { return IpcMessage{}; } return it->second(request); } private: template static IpcMessage callMethod(Obj* obj, Ret (Obj::*method)(Args...), IpcMessage& msg) { auto tuple = readArgs(msg); Ret result = std::apply(method, std::tuple_cat(std::make_tuple(obj), tuple)); IpcMessage out; out.add(result); return out; } template static std::tuple readArgs(IpcMessage& msg) { return std::tuple{msg.template get()...}; } std::unordered_map> handlers; };