A custom no-value policy
If you want your basic_outcome<>
or basic_result<>
instances to call
std::abort()
whenever .value()
is called on an object that does not contain a value, or .error()
is called on an object that does not contain an error, you will need to define your own no-value policy as follows:
struct abort_policy : outcome::policy::base
{
template <class Impl> static constexpr void wide_value_check(Impl &&self)
{
if(!base::_has_value(std::forward<Impl>(self)))
std::abort();
}
template <class Impl> static constexpr void wide_error_check(Impl &&self)
{
if(!base::_has_error(std::forward<Impl>(self)))
std::abort();
}
template <class Impl> static constexpr void wide_exception_check(Impl &&self)
{
if(!base::_has_exception(std::forward<Impl>(self)))
std::abort();
}
};
All policies ought to inherit from base in order to provide your policy implementation with
the internal policy API for accessing and manipulating result
and outcome
state.
Once the policy is defined, you have to specify it when providing your own
basic_outcome
specialization:
template <typename T>
using strictOutcome = //
outcome::basic_outcome<T, std::error_code, std::exception_ptr, abort_policy>;