Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实施';反向应用功能';在C++;? 我写了我的项目的C++部分,它以OcAML为主要语言。我对OCaml和C++的经验更丰富。_C++_Ocaml - Fatal编程技术网

如何实施';反向应用功能';在C++;? 我写了我的项目的C++部分,它以OcAML为主要语言。我对OCaml和C++的经验更丰富。

如何实施';反向应用功能';在C++;? 我写了我的项目的C++部分,它以OcAML为主要语言。我对OCaml和C++的经验更丰富。,c++,ocaml,C++,Ocaml,当这个名称是逻辑的概念点(突出显示它)或当这个名称被多个函数期望作为参数时(可能,我在其他情况下也使用它,但对于当前上下文并不重要),我使用名称绑定(在OCaml中,在C++中使用变量)。以下4个变量对我来说不仅仅是多余的。对我来说,它们制造了信息噪音,降低了代码的可读性 auto caml_level = Caml::Value::of_int(level); auto caml_api_state = Core::Api::File::open_new(caml_level); auto p

当这个名称是逻辑的概念点(突出显示它)或当这个名称被多个函数期望作为参数时(可能,我在其他情况下也使用它,但对于当前上下文并不重要),我使用名称绑定(在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);
这就是为什么我编写了计算
状态的代码,而不使用任何附加变量

auto status =
  statuses.at(
    _api -> extract_and_save_state(
      Core::Api::File::open_new(
        Caml::Value::of_int(
          level
        )
      )
    )
  );
对我来说,第二个示例看起来更好,但仍然不令人满意,因为有必要从下到上阅读此代码。我是否可以颠倒函数的顺序以提供从上到下的读取能力?是否可以将它写成第三个样本,在这里我们想象C++有OcAML<代码> > > /Cord>运算符?< /P>
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,反之亦然,因此,它可能有很多变量。这些变量是低级操作的结果,不是概念点。因此,不容易给它们提供好的N。ames)。

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;

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;

确切地说,有
|>
操作符并不重要,我问了关于任何“反向应用程序函数”的问题。我没有试着运行你的代码,但我认为这就是我要找的。顺便说一句,如果你周围交换
F
t
,你可以有
|rap>
语法;)@n.“代词m。”。这不需要加载
()
?不需要。您只需要包装函数,而不是参数
#定义I | rap
并且我们可以使用
I>
伪运算符(I-是大写的I)。准确地定义
|>
运算符并不重要,我问过任何“反向应用函数”。我没有试着运行你的代码,但我认为这正是我想要的。顺便说一句,如果你交换
F
t
,你可以使用
|rap>
语法;)@n、 代词是m。这不需要加载
()
?不需要。您只需要包装函数,而不是参数
#define I | rap
我们可以使用
I>
伪运算符(I-是大写的I)