C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如果`f`具有非空返回类型 – 如何重构这个模式,返回`f`的结果?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个步骤(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()?

@H_675_23@

解决方法

你可以在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++
@H_675_23@ @H_675_23@

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。