Am 31.05.2017 4:26 nachm. schrieb "Peter Dimov via Boost" < boost@lists.boost.org>: Gavin Lambert wrote:
I probably should have thought of asking this earlier, but it occurs to me now that my own mental model of how an "outcome"-ish type should act is probably not suited to variant storage at all.
So just out of curiosity I thought I'd ask whether people prefer this sort of interface:
... Or this sort of interface:
... Neither. I prefer a combination of the two. Like a variant, exactly one of has_value(), has_error(), has_exception() should report true, depending on whether you called set_value, set_error, or set_exception. The accessors however, should work as you previously outlined. // throws when !has_value() T value() const; // error_code() when has_value() // error when has_error() // errc::has_exception when has_exception() error_code error() const noexcept; // nullptr when has_value() // either nullptr or make_exception_ptr(system_error()) when has_error() Why not this: make_exception_ptr(system_error(error()) when has_error()? // exception when has_exception() exception_ptr exception() const noexcept;