36 result(
const T& value) : data_(value) {}
37 result(T&& value) : data_(std::move(value)) {}
38 result(
const E& error) : data_(error) {}
39 result(E&& error) : data_(std::move(error)) {}
41 bool has_value()
const {
return std::holds_alternative<T>(data_); }
42 bool has_error()
const {
return std::holds_alternative<E>(data_); }
44 explicit operator bool()
const {
return has_value(); }
46 const T& value()
const & {
return std::get<T>(data_); }
47 T& value() & {
return std::get<T>(data_); }
48 T&& value() && {
return std::get<T>(std::move(data_)); }
50 const T& operator*()
const & {
return value(); }
51 T& operator*() & {
return value(); }
52 T&& operator*() && {
return std::move(*this).value(); }
54 const T* operator->()
const {
return &value(); }
55 T* operator->() {
return &value(); }
57 const E& error()
const & {
return std::get<E>(data_); }
58 E& error() & {
return std::get<E>(data_); }
59 E&& error() && {
return std::get<E>(std::move(data_)); }
62 std::variant<T, E> data_;