美文网首页
C++ finally写法

C++ finally写法

作者: 卡卡罗忒 | 来源:发表于2023-03-05 14:15 被阅读0次
template<class F>
class final_act {
public:
    explicit final_act(F f) noexcept: f_(std::move(f)), invoke_(true) {}

    final_act(final_act &&other) noexcept: f_(std::move(other.f_)), invoke_(other.invoke_) {
        other.invoke_ = false;
    }

    final_act(const final_act &) = delete;

    final_act &operator=(const final_act &) = delete;

    ~final_act() noexcept {
        if (invoke_) f_();
    }

private:
    F f_;
    bool invoke_;
};
template<class F>
inline final_act<F> _finally(const F &f) noexcept {
    return final_act<F>(f);
}
template<class F>
inline final_act<F> _finally(F &&f) noexcept {
    return final_act<F>(std::forward<F>(f));
}
#define concat1(a, b) a ## b
#define concat2(a, b) concat1(a,b)
#define _finally_object concat2(_finally_object_, __COUNTER__)
#define finally(func) auto _finally_object = _finally(func)
int abc = 0;
int main() {
    {
        abc = 1;
        auto exe = [&]() {
            abc = 2;
        };
        auto ddd = final_act<decltype(exe)>(exe);
    }
    {
        finally([&]() { abc = 3; });
        finally([&]() { abc = 4; });
    }
    abc = 5;
    std::cout << "test:abc=" << abc << std::endl;
    return 0;
}

猜猜abc是多少

相关文章

网友评论

      本文标题:C++ finally写法

      本文链接:https://www.haomeiwen.com/subject/eynuldtx.html