c – 如果`f`具有非空返回类型 – 如何重构这个模式,返回`f`的结
发布时间:2020-12-16 03:13:18 所属栏目:百科 来源:网络整理
导读:我有一个步骤(f)功能: 在调用f前执行一些代码. 调用f(). 调用f后执行一些代码. 如果f不返回void返回f的结果值. 由于上述第四点,小代码实施步骤困扰了我, template typename TFauto step(TF f){ // Execute some actions before `f`. do_something(); using
我有一个步骤(f)功能:
>在调用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++ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |