ADL bridging
In Outcome v2.2 the ADL-based event hooks were replaced with policy-based event hooks (next page). The code in this section is still valid in v2.2 onwards, it’s just that ADL is no longer used to find the hooks.
In a previous section, we used the failure_info
type to create
the ADL bridge into the namespace where the ADL discovered outcome_throw_as_system_error_with_payload()
function was to be found.
Here we do the same, but more directly by creating a thin clone of std::error_code
into the local namespace. This ensures that this namespace will be searched by the
compiler when discovering the event hooks (Outcome v2.1 and earlier only).
namespace error_code_extended
{
// Use the error_code type as the ADL bridge for the hooks by creating a type here
// It can be any type that your localised result uses, including the value type but
// by localising the error code type here you prevent nasty surprises later when the
// value type you use doesn't trigger the ADL bridge.
struct error_code : public std::error_code
{
// literally passthrough
using std::error_code::error_code;
error_code() = default;
error_code(std::error_code ec)
: std::error_code(ec)
{
}
};
// Localise result and outcome to using the local error_code so this namespace gets looked up for the hooks
template <class R> using result = OUTCOME_V2_NAMESPACE::result<R, error_code>;
template <class R> using outcome = OUTCOME_V2_NAMESPACE::outcome<R, error_code /*, std::exception_ptr */>;
}
For convenience, we template alias local copies of result
and outcome
in this
namespace bound to the ADL bridging error_code
.