我想定义一个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_;
};
1条答案
按热度按时间o7jaxewo1#
实际上,第一个实现也适用于全局函数,只需使用