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