Niall Douglas wrote:
Github: https://github.com/ned14/outcome
Docs (highly incomplete): https://ned14.github.io/outcome/
This is a welcome development, if still a bit too-policy-heavy for my taste. Regarding construction, I have the following suggestion. Instead of reusing in_place_type, use the following tag types: struct in_place_value_t { constexpr in_place_value_t() noexcept {} }; constexpr in_place_value_t in_place_value; struct in_place_error_t { constexpr in_place_error_t() noexcept {} }; constexpr in_place_error_t in_place_error; This is isomorphic but superior to using in_place_index<0> and in_place_index<1>, which were my initial choice. Now the ambiguity when T == EC is resolved and template<class... A> result( in_place_value_t, A&&... a ); always initializes the value and does not need to be disabled when T == EC. In addition, I would add template<class... A> result( A&&... a ); which initializes the value when it's constructible from a..., the error when that's constructible from a..., and is disabled when neither or both are constructible. (The implicit/explicit duality when sizeof...(A) == 1 complicates the actual implementation of the above but conceptually it still works as explained. Also, the sizeof...(A) == 0 case needs to be disabled.)