“General RAII”类在析构函数中调用lambda

时间:2017-09-23 15:38:26

标签: c++

我写了一个在构造函数中调用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。

0 个答案:

没有答案