c – 如果`f`具有非空返回类型 – 如何重构这个模式,返回`f`的结果?

c – 如果`f`具有非空返回类型 – 如何重构这个模式,返回`f`的结果?,第1张

概述我有一个步骤(f)功能: >在调用f前执行一些代码. >调用f(). >调用f后执行一些代码. >如果f不返回void返回f的结果值. 由于上述第四点,小代码实施步骤困扰了我, template <typename TF>auto step(TF&& f){ // Execute some actions before `f`. do_something(); 我有一个步骤(f)功能:

>在调用f前执行一些代码.
>调用f().
>调用f后执行一些代码.
>如果f不返回voID返回f的结果值.

由于上述第四点,小代码实施步骤困扰了我,

template <typename TF>auto step(TF&& f){       // Execute some actions before `f`.     do_something();    using f_return_type = decltype(f());    return static_if(std::is_same<f_return_type,voID>{})        .then([](auto&& xf) mutable            {                // Do not return anything if `xf` returns voID.                xf();                // Execute some actions after `f`.                do_something_after_f();            })        .else_([](auto&& xf) mutable            {                auto result = xf();                // Execute some actions after `f`.                do_something_after_f();                return result;            })(std::forward<TF>(f));}

(注意重复调用f和do_something_after_f.)

我必须使用某种条件编译时(模板专门化或者static_if,如示例所示)根据f的返回类型进行分支.

理想情况下,我想这样编译:

template <typename TF>auto step(TF&& f){       // Execute some actions before `f`.     do_something();    decltype(auto) eventual_result = f();    // Execute some actions after `f`.    do_something_after_f();    return result;}

但是它不是,因为finalual_result可以是voID,这是一个不完整的类型.

有没有任何重构这个代码的方式,以避免重复调用f()和do_something_after_f()?

解决方法 你可以在return语句之后运行do_something_after_f(),把它放到局部变量的析构函数中.
struct Cleanup {    ~Cleanup() { do_something_after_f(); }} cleanup;return f(); // it's legal to return a voID Expression in C++
总结

以上是内存溢出为你收集整理的c – 如果`f`具有非空返回类型 – 如何重构这个模式,返回`f`的结果?全部内容,希望文章能够帮你解决c – 如果`f`具有非空返回类型 – 如何重构这个模式,返回`f`的结果?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1253889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存