ADL bridging - Boost.Outcome documentation

# ADL bridging

note

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 = BOOST_OUTCOME_V2_NAMESPACE::result<R, error_code>;
      template <class R> using outcome = BOOST_OUTCOME_V2_NAMESPACE::outcome<R, error_code /*, std::exception_ptr */>;
    }

View this code on Github

For convenience, we template alias local copies of `result` and `outcome` in this namespace bound to the ADL bridging `error_code`.

Last revised: December 15, 2020 at 12:22:39 UTC