#include #include #include #include #include namespace ztl{ template struct overloaded:Ts...{using Ts::operator()...;}; template overloaded(Ts...)->overloaded; template auto match(std::variant& v, Fs&&... func) { return std::visit(ztl::overloaded{std::forward(func)...}, v); } template auto match(const std::variant& v, Fs&&... func) { return std::visit(ztl::overloaded{std::forward(func)...}, v); } template auto match(std::variant&& v, Fs&&... func) { return std::visit(ztl::overloaded{std::forward(func)...}, std::move(v)); } struct Err:std::string{}; // template // struct Ok{ // T data; // }; template struct Result:std::variant{ T unwrap(){ return match(*this,[](const T&t){ return t; },[](const Err &e){ throw std::runtime_error(e); T t; return t; }); } }; template void logger(Ts&&...v){ #ifndef NDEBUG std::cout<<"log["; (std::cout<<...<