初识
项目组有个go过来的大佬,再各种释放资源的时候特别不爽,c++咋就没有defer。 打开关闭文件的时候,这种操作很常见。多个判断多次关闭的操作很多,也会很容易出现错误
bool a(){
QFile f(m_path + "/data/test.html");
if (!f.open(QIODevice::ReadOnly|QIODevice::Text))
return false
if (m_isFalse) {
f.close();
return false;}
f.close();
return true;
}
QScopeGuard代码优化
这样就不需要多次进行操作了,因为
bool a(){
QFile f(m_path + "/data/test.html");
if (!f.open(QIODevice::ReadOnly|QIODevice::Text))
return false
auto cleanup = qScopeGuard([&] { f.close(); });
if (m_isFalse) {
return false;
}
return true;
}
析构的时候会做处理
QScopeGuard封装 如果一个作用域中调用的时候避免重名
#define CONCAT_(a, b) a ## b
#define CONCAT(a, b) CONCAT_(a,b)
#define DEFER(fn) auto CONCAT(__defer__, __LINE__) = qScopeGuard[&] ( ) { fn ; }
手撸代码
#include <functional>
class ScopeGuard {
public:
template<class Callable>
ScopeGuard(Callable &&fn) : fn_(std::forward<Callable>(fn)) {}
ScopeGuard(ScopeGuard &&other) : fn_(std::move(other.fn_)) {
other.fn_ = nullptr;
}
~ScopeGuard() {
if (fn_) fn_();
}
ScopeGuard(const ScopeGuard &) = delete;
void operator=(const ScopeGuard &) = delete;
private:
std::function<void()> fn_;
};
#define CONCAT_(a, b) a ## b
#define CONCAT(a, b) CONCAT_(a,b)
#define DEFER(fn) ScopeGuard CONCAT(__defer__, __LINE__) = [&] ( ) { fn ; }
|