40 template <
typename T,
class E>
43 std::expected<std::reference_wrapper<std::remove_reference_t<T>>, std::shared_ptr<E>>,
44 std::expected<T, std::shared_ptr<E>>
55 return std::unexpected<std::shared_ptr<E>>(std::move(error_ptr));
66 return std::unexpected<std::shared_ptr<std::decay_t<E>>>(
67 std::make_shared<std::decay_t<E>>(std::forward<E>(error))
78 template <
typename Base,
typename Derived>
79 auto Unexpected(Derived&& error) -> std::unexpected<std::shared_ptr<Base>>
80 requires std::is_base_of_v<Base, std::decay_t<Derived>> &&
81 (!std::same_as<Base, std::decay_t<Derived>>)
83 using DerivedT = std::decay_t<Derived>;
84 return std::unexpected<std::shared_ptr<Base>>(std::static_pointer_cast<Base>(std::make_shared<DerivedT>(std::forward<Derived>(error))));
95 template <
typename E,
typename... Args>
96 auto Unexpected(
const std::string& fmt, Args&&... args) {
97 std::string formatted_message;
99 if constexpr (
sizeof...(Args) == 0) {
100 formatted_message = fmt;
102 auto format_args = std::make_format_args(args...);
103 formatted_message = std::vformat(fmt, format_args);
106 return std::unexpected<std::shared_ptr<E>>(
107 std::make_shared<E>(std::move(formatted_message))
Lvalue or rvalue reference type.
Definition categories.hxx:49
Root namespace of the StormByte suite.
auto Unexpected(std::shared_ptr< E > error_ptr)
Builds std::unexpected from an existing error pointer.
Definition expected.hxx:54
std::conditional_t< Type::Reference< T >, std::expected< std::reference_wrapper< std::remove_reference_t< T > >, std::shared_ptr< E > >, std::expected< T, std::shared_ptr< E > > > Expected
std::expected alias with reference and shared-error handling.
Definition expected.hxx:45