如何在C++中实现'reverse application function'?

How to implement 'reverse application function' in C++?

我正在编写以 OCaml 作为主要语言的项目的 C++ 部分。我对 OCaml 比 C++ 更有经验。

当此名称是逻辑的概念点(以突出显示)或当此名称被多个函数期望作为参数时(可能,我在其他情况下也可以使用它,但它对当前上下文并不重要)。以下 4 个变量对我来说不仅仅是多余的。对于我来说,它们会产生信息噪音并降低代码可读性。

auto caml_level = Caml::Value::of_int(level);
auto caml_api_state = Core::Api::File::open_new(caml_level);
auto polimorpic_variant_hash_status = 
  _api -> extract_and_save_state(caml_api_state);
auto status = statuses.at(polimorpic_variant_hash_status);

这就是为什么我编写了计算 status 而不使用任何其他变量的代码。

auto status =
  statuses.at(
    _api -> extract_and_save_state(
      Core::Api::File::open_new(
        Caml::Value::of_int(
          level
        )
      )
    )
  );

对于我来说,第二个示例看起来更好但仍然不能令人满意,因为需要从下到上阅读这段代码。我可以颠倒函数的顺序以提供从上到下阅读的能力吗?是否可以像第三个示例那样编写它,我们假设 C++ 具有 OCaml |> 运算符?

auto status =
  level |> Caml::Value::of_int
        |> Core::Api::File::open_new
        |> _api -> extract_and_save_state
        |> statuses.at

如何在C++中实现反向应用功能?

(这些例子来自于我试图在 OCaml 和 C++ 之间实现一个具有良好可读性的桥梁。这个桥梁包含很多转换,比如从 C int 到 OCaml int,反之亦然,因此,它可能有很多变量。而且这些变量是底层操作的结果,不是概念点。所以,给它们取个好名字并不容易。

C++ 不允许您定义新的中缀运算符,因此您将不得不使用标识符。

假设您很高兴使用 | rap >(空格可选)而不是 |>

struct rap_t {
    template <typename F>
    struct wrapper_t { F f; };

    template <typename F>
    friend wrapper_t<F> operator>(rap_t, F&& f) { return { std::forward<F>(f) }; }

    template <typename T, typename F>
    friend std::invoke_result_t<F, T> operator|(T&& t, wrapper_t<F> w)
    { return std::invoke(std::forward<F>(w.f), std::forward<T>(t)); }
} rap;

这让你可以

auto reuslt =
  level |rap> &Caml::Value::of_int
        |rap> &Core::Api::File::open_new
        |rap> std::bind_front(&Api::extract_and_save_state, _api)
        |rap> &results.at