如何在C++模板类中保存任何可调用对象

vfh0ocws  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(202)

我想定义一个scopeguard,它在作用域退出时运行一些清理代码。我不想使用std::function<void()>,因为它有一些开销。然后我提出了这个模板化的实现。

template <typename Fn>
class ScopeGuard {
public:
    ScopeGuard(Fn&& fn) : fn_(std::forward<T>(fn)) {}
    ~ScopeGuard() { fn_(); }
private:
    Fn fn_;
};

这对lambdas很有效。但是,它不接受全局函数,即左值。该如何解决这个问题?
我认为这是一个更一般的问题,如何制作一个模板,可以保存任何可调用对象(全局函数,lambda表达式,具有operator()的类示例)最小开销
下面是更好的方法吗?

template <typename Fn>
class ScopeGuard {
public:
    template <typename T>
    ScopeGuard(T&& fn) : fn_(std::forward<T>(fn)) {}
    ~ScopeGuard() {
        fn_();
    }
private:
    Fn fn_;
};
o7jaxewo

o7jaxewo1#

实际上,第一个实现也适用于全局函数,只需使用

ScopeGuard g(&foo);

相关问题