Interoperation
This is the final section of the tutorial, and it is unavoidably quite lengthy.
One thing which Outcome solves – which alternatives do not – is how to
non-intrusively tie together multiple third party libraries, each using
Outcome – or some other T|E
implementatation like std::expected<T, E>
– with custom incommensurate E
types, or indeed arbitrary return
types which are “split” T|E
return types. Solving
this well is the coup de grĂ¢ce of Outcome against alternative approaches
to this problem domain,
including std::expected<T, E>
. It is the major reason why you should
consider using Outcome over alternatives, including Expected.
Firstly we shall explore some of the problems faced by the software
developer when T|E
return type based code proliferates at scale,
where dozens of libraries may be using completely incompatible T|E
return types.
Secondly we shall introduce the ValueOrError
concept support in Outcome
which implements a subset of the proposed WG21 ValueOrError
concept framework.
Finally, we shall then step through a worked example which mocks up a realistic
situation that the software developer may find themselves in: tying
together disparate third party libraries, whose source code cannot be
modified, into an application-wide, mixed-mode T|E
and exception
throwing universal error handling system which is capable of
accurately representing the original failure, but also propagating it
in a way that the application can deal with universally.