Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.
Prev Up HomeNext

Upgrading the Filesystem TS

An Outcome based solution to the dual overload problem is straightforward:

namespace filesystem2
  // Error code + paths related to a failure. Also causes ADL discovery to check this namespace.
  struct failure_info
    std::error_code ec;
    path path1, path2;

  // Tell Outcome that failure_info is to be treated as a std::error_code
  inline const std::error_code &make_error_code(const failure_info &fi) { return; }

  // Localise an outcome implementation specific to this namespace. Normally would just
  // be `result`, but for clarity we'll use `fs_result`.
  template <class T> using fs_result = outcome::result<T, failure_info>;

  /*! Copies the file at path `from` to path `to`.
  \returns Successful if file was successfully copied, otherwise the error code reported
  by the operating system plus a payload of the paths involved.
  \throws Never throws.
  fs_result<void> copy_file(const path &from, const path &to) noexcept;
View this code on Github

Starting at the bottom, there is now a single copy_file() function which returns a fs_result<void>. As result is either successful or not, there is no longer any point in returning a boolean, so we simply return void on success. On failure, as the template alias fs_result<T> above it shows, we are returning a failure_info structure containing an error code and the same additional information as filesystem_error provides.

It is important to note that the fact that failure_info is defined in namespace filesystem2 is very important. This is because Outcome uses Argument Dependent Lookup (ADL) to find the make_error_code() function, as well as other customisation point free functions. In other words, only the namespaces as defined by ADL are searched when finding a free function telling us what to do for failure_info, which includes the namespace failure_info is declared into.

Last revised: February 08, 2019 at 22:18:08 UTC

Prev Up HomeNext