我写了一个在构造函数中调用lambda的类:
template<typename Lambda>
class scope_guard
{
public:
scope_guard(const Lambda & f, bool e = true) : free(f), engaged(e)
{
}
scope_guard(const scope_guard &) = delete;
scope_guard & operator = (const scope_guard &) = delete;
scope_guard(scope_guard && other) : free(std::move(other.free))
{
other.engaged = false;
}
scope_guard & operator = (scope_guard && other)
{
free = std::move(other.free);
other.engaged = false;
}
~scope_guard()
{
if (engaged)
{
free();
}
}
void release()
{
engaged = false;
}
private:
Lambda free;
bool engaged = true;
};
template <class Lambda>
inline scope_guard<Lambda> make_scope_guard(const Lambda & free, bool engaged = true)
{
return scope_guard<Lambda>(free, engaged);
}
template <class Init, class Free>
inline scope_guard<Free> make_scope_guard(const Init & init, const Free & free, bool engaged = true)
{
if (engaged)
{
init();
}
return make_scope_guard(free, engaged);
}
但我不确定在我的代码中使用这个类是否足够聪明。像这样使用这个类来恢复OpenGL状态是个好主意,例如?
{
const bool enableDepthTest = IsDepthTestEnabledHere();
auto guard = awl::make_scope_guard(
[]() { glEnable(GL_DEPTH_TEST); },
[]() { glDisable(GL_DEPTH_TEST); },
enableDepthTest);
//do OpenGL drawing here
}
因为我不仅要问OpenGL,而且,一般情况下,如果设置了某些东西,并且当控件离开块时应该取消设置为什么不使用这个类呢?至少当我有这个通用机制并且不需要编写单独的类设置深度测试开/关或深度掩码开/关等时它是有用的。因为这个类不能替代像std这样的现有RAII类::的unique_ptr。