#pragma once #include // TODO T&& constructor // TODO T&& Result::take() with consumed semantics template class Result { public: constexpr Result() = default; explicit constexpr Result(T t) : is_ok(true), data{.t = t} {}; explicit constexpr Result(E e) : is_ok(false), data{.e = e} {}; constexpr operator bool() const { return is_ok; } constexpr E error() const { return is_ok ? E::NoError : data.e; } constexpr T value() const { return is_ok ? data.t : T{}; } private: const bool is_ok = false; union { T t; E e = E::NoError; } data; };