20 Result(T&& value) :
Result(ok_tag {}, std::move(value)) {}
22 template<
typename U = E,
typename = std::enable_if_t<!std::is_same_v<T, U>>>
25 template<
typename U = E,
typename = std::enable_if_t<!std::is_same_v<T, U>>>
26 Result(E&& error) :
Result(err_tag {}, std::move(error)) {}
29 return std::holds_alternative<T>(m_data);
33 return std::holds_alternative<E>(m_data);
36 const T& expect(
const std::string& message)
const& {
40 fmt::print(stderr,
"{}: {}\n", message, unwrap_err().message());
44 T&& expect(
const std::string& message) && {
46 return std::move(*this).unwrap();
48 fmt::print(stderr,
"{}: {}\n", message, unwrap_err().message());
52 const T& unwrap()
const& {
53 assert(is_ok() &&
"Called unwrap on an Err value");
54 return std::get<T>(m_data);
58 assert(is_ok() &&
"Called unwrap on an Err value");
59 return std::move(std::get<T>(m_data));
62 const T& unwrap_ok()
const& {
67 return std::move(*this).unwrap();
70 const E& unwrap_err()
const& {
71 assert(is_err() &&
"Called unwrap_err on an Ok value");
72 return std::get<E>(m_data);
76 assert(is_err() &&
"Called unwrap_err on an Ok value");
77 return std::move(std::get<E>(m_data));
97 auto and_then(F&& f)
const {
99 if constexpr (is_result<decltype(f(std::declval<T>()))>::value) {
109 T unwrap_or(U&& default_value)
const {
113 return static_cast<T
>(std::forward<U>(default_value));
117 T unwrap_or_else(F&& f)
const {
121 return f(unwrap_err());
125 std::variant<T, E> m_data;
132 struct is_result: std::false_type {};
134 template<
typename U,
typename V>
135 struct is_result<
Result<U, V>>: std::true_type {};
137 Result(ok_tag,
const T& value) : m_data(value) {}
139 Result(ok_tag, T&& value) : m_data(std::move(value)) {}
141 Result(err_tag,
const E& error) : m_data(error) {}
143 Result(err_tag, E&& error) : m_data(std::move(error)) {}