#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 RpcArgs& args) -> RpcValue { auto tuple = readArgs(args); Ret result = std::apply( method, std::tuple_cat(std::make_tuple(instance), tuple)); // PoC: считаем, что Ret == int. return RpcValue::fromInt(result); }; } RpcValue dispatch(const std::string& method, const RpcArgs& args) const { auto it = handlers.find(method); if (it == handlers.end()) { // PoC: в случае ошибки возвращаем 0. return RpcValue::fromInt(0); } return it->second(args); } private: template static std::tuple readArgsImpl(const RpcArgs& args, std::index_sequence) { return std::tuple{ static_cast(args[I].asInt())...}; // PoC: только int } template static std::tuple readArgs(const RpcArgs& args) { return readArgsImpl( args, std::make_index_sequence{}); } std::unordered_map> handlers; };