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 printf(
"%s: %s\n", message, unwrap_err().message().c_str());
44 T&& expect(
const std::string& message) && {
46 return std::move(*this).unwrap();
48 printf(
"%s: %s\n", message, unwrap_err().message().c_str());
52 const T& unwrap()
const& {
54 std::cout <<
"Called unwrap on an Err value:"
55 << unwrap_err().message() <<
"\n";
58 return std::get<T>(m_data);
63 std::cout <<
"Called unwrap on an Err value:"
64 << unwrap_err().message() <<
"\n";
67 return std::move(std::get<T>(m_data));
70 const T& unwrap_ok()
const& {
75 return std::move(*this).unwrap();
78 const E& unwrap_err()
const& {
79 assert(is_err() &&
"Called unwrap_err on an Ok value");
80 return std::get<E>(m_data);
84 assert(is_err() &&
"Called unwrap_err on an Ok value");
85 return std::move(std::get<E>(m_data));
105 auto and_then(F&& f)
const {
107 if constexpr (is_result<decltype(f(std::declval<T>()))>::value) {
117 T unwrap_or(U&& default_value)
const {
121 return static_cast<T
>(std::forward<U>(default_value));
125 T unwrap_or_else(F&& f)
const {
129 return f(unwrap_err());
133 std::variant<T, E> m_data;
140 struct is_result: std::false_type {};
142 template<
typename U,
typename V>
143 struct is_result<
Result<U, V>>: std::true_type {};
145 Result(ok_tag,
const T& value) : m_data(value) {}
147 Result(ok_tag, T&& value) : m_data(std::move(value)) {}
149 Result(err_tag,
const E& error) : m_data(error) {}
151 Result(err_tag, E&& error) : m_data(std::move(error)) {}