i've been working with a Result clone written on top of std::expected, and, while i miss pretty much everything else about nim-result, ive grown to enjoy being able to return a bare T from a function returning Result[T,E] #include <expected> #include <string> using err_t = std::string; template<class T> using Result = std::expected<T,err_t>; using err = std::unexpected<err_t>; Result<int> foo(bool x){ if (x) return err("oh noes"); else return 5; } Run
if you've got a standard error type in your project like type R[T] = Result[T,string] Run then you can have that implicit conversion, too, for good or ill, with converter toR[T](x:T):R[T] = ok(x) proc foo(x:bool):Result[int,string] = if x: err("oh noes") else: 5 Run but embracing strict typing is more the Nim way