如何实现在退出作用域时恢复价值的作用域保护器?

克洛菲

以下是Scope Guard的惯用C ++ 11实现,该实现在范围退出时恢复值吗?

template<typename T>
class ValueScopeGuard
{
public:
    template<typename U>
    ValueScopeGuard(T& value, U&& newValue):
        _valuePtr(&value),
        _oldValue(std::forward<U>(newValue))
    {
        using std::swap;
        swap(*_valuePtr, _oldValue);
    }
    ~ValueScopeGuard()
    {
        if(_valuePtr)
        {
            using std::swap;
            swap(*_valuePtr, _oldValue);
        }
    }

    // Copy
    ValueScopeGuard(ValueScopeGuard const& other) = delete;
    ValueScopeGuard& operator=(ValueScopeGuard const& other) = delete;

    // Move
    ValueScopeGuard(ValueScopeGuard&& other):
        _valuePtr(nullptr)
    {
        swap(*this, other);
    }
    ValueScopeGuard& operator=(ValueScopeGuard&& other)
    {
        ValueScopeGuard(std::move(other)).swap(*this);
        return *this;
    }

private:
    T* _valuePtr;
    T _oldValue;

    friend void swap(ValueScopeGuard& lhs, ValueScopeGuard& rhs)
    {
        using std::swap;
        swap(lhs._valuePtr, rhs._valuePtr);
        swap(lhs._oldValue, rhs._oldValue);
    }
};

template<typename T, typename U>
ValueScopeGuard<T> makeValueScopeGuard(T& value, U&& newValue)
{
    return {value, std::forward<U>(newValue)};
}

它可以用于临时更改值,如下所示:

int main(int argc, char* argv[])
{
    // Value Type
    int i = 0;
    {
        auto guard = makeValueScopeGuard(i, 1);
        std::cout << i << std::endl; // 1
    }
    std::cout << i << std::endl; // 0

    // Movable Type
    std::unique_ptr<int> a{new int(0)};
    {
        auto guard = makeValueScopeGuard(a, std::unique_ptr<int>{new int(1)});
        std::cout << *a << std::endl; // 1
    }
    std::cout << *a << std::endl; // 0

    return 0;
}

这样的简单实用程序是否已经在某个地方的库中实现了?我看过Boost.ScopeExit,但它的预期用法似乎不同且更加复杂。

乔纳森·韦克利

您的move构造函数使指针成员未初始化,因此rvalue对象最终持有一个垃圾指针,该指针在其析构函数中取消引用。那是一个错误。您应该将其初始化为,nullptrnullptr在析构函数中进行检查

对于这样的类型,我不希望移动分配是简单的交换,我希望右值最终不拥有任何东西。因此,我将改为执行这种移动,因此右值最终为空:

ValueScopeGuard& operator=(ValueScopeGuard&& other)
{
    ValueScopeGuard(std::move(other)).swap(*this);
    return *this;
}

这个名字makeValueScopeGuard对我来说还不清楚,它会更改值本身,我希望它只是复制当前值并将其恢复到析构函数中。

就现有类型而言,我能想到的最接近的是Boost I / O状态保护程序,它们不会改变当前状态,它们只是复制并恢复它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何实现在退出作用域时恢复价值的作用域保护器?

来自分类Dev

测试带有隔离作用域的指令时如何获得对控制器作用域的访问

来自分类Dev

Javascript:“受保护的”作用域

来自分类Dev

写保护类作用域

来自分类Dev

整个会话存储浏览器(作用域)或LocalStorage在退出时被删除

来自分类Dev

编辑时如何防止作用域绑定?

来自分类Dev

编辑时如何防止作用域绑定?

来自分类Dev

Rails Cookie的价值与具有辅助作用域的控制器的价值不同吗?

来自分类Dev

变量作用域的作用域

来自分类Dev

Angular:如何连接控制器中的作用域和服务中的作用域?

来自分类Dev

当作用域对象而不是作用者时,如何使用方法表示域对象的行为?

来自分类Dev

当作用域对象而不是作用器时,如何使用方法表示域对象的行为?

来自分类Dev

当类帮助器在作用域内时,如何调用原始类的代码?

来自分类Dev

使用“ controller As”和IIFE时如何从子控制器访问父作用域?

来自分类Dev

使用流星时,如何正确调整嵌套的#each空格键迭代器的作用域?

来自分类Dev

如何访问作用域函数

来自分类Dev

如何从父作用域获取参数到子作用域?

来自分类Dev

角度控制器(和作用域)继承如何工作

来自分类Dev

传递给指令时如何更新Angular作用域属性?

来自分类Dev

调用函数时如何修复函数作用域问题

来自分类Dev

示波器防护器/作用域退出习惯会标准化吗?

来自分类Dev

程序以状态!= 0(set -e)退出后执行EXIT陷阱时的Bash函数作用域状态

来自分类Dev

当派生类退出作用域时,基成员是否会被销毁?

来自分类Dev

使用Typescript时,如何从子控制器访问父控制器中的作用域函数?

来自分类Dev

使用“作为控制器”语法时,如何在子控制器中引用父级的作用域?

来自分类Dev

它是安全的锁/作用域保护工具吗?

来自分类Dev

它是安全的锁/作用域保护工具吗?

来自分类Dev

枚举器和函数作用域

来自分类Dev

窃听路由器与异步作用域

Related 相关文章

  1. 1

    如何实现在退出作用域时恢复价值的作用域保护器?

  2. 2

    测试带有隔离作用域的指令时如何获得对控制器作用域的访问

  3. 3

    Javascript:“受保护的”作用域

  4. 4

    写保护类作用域

  5. 5

    整个会话存储浏览器(作用域)或LocalStorage在退出时被删除

  6. 6

    编辑时如何防止作用域绑定?

  7. 7

    编辑时如何防止作用域绑定?

  8. 8

    Rails Cookie的价值与具有辅助作用域的控制器的价值不同吗?

  9. 9

    变量作用域的作用域

  10. 10

    Angular:如何连接控制器中的作用域和服务中的作用域?

  11. 11

    当作用域对象而不是作用者时,如何使用方法表示域对象的行为?

  12. 12

    当作用域对象而不是作用器时,如何使用方法表示域对象的行为?

  13. 13

    当类帮助器在作用域内时,如何调用原始类的代码?

  14. 14

    使用“ controller As”和IIFE时如何从子控制器访问父作用域?

  15. 15

    使用流星时,如何正确调整嵌套的#each空格键迭代器的作用域?

  16. 16

    如何访问作用域函数

  17. 17

    如何从父作用域获取参数到子作用域?

  18. 18

    角度控制器(和作用域)继承如何工作

  19. 19

    传递给指令时如何更新Angular作用域属性?

  20. 20

    调用函数时如何修复函数作用域问题

  21. 21

    示波器防护器/作用域退出习惯会标准化吗?

  22. 22

    程序以状态!= 0(set -e)退出后执行EXIT陷阱时的Bash函数作用域状态

  23. 23

    当派生类退出作用域时,基成员是否会被销毁?

  24. 24

    使用Typescript时,如何从子控制器访问父控制器中的作用域函数?

  25. 25

    使用“作为控制器”语法时,如何在子控制器中引用父级的作用域?

  26. 26

    它是安全的锁/作用域保护工具吗?

  27. 27

    它是安全的锁/作用域保护工具吗?

  28. 28

    枚举器和函数作用域

  29. 29

    窃听路由器与异步作用域

热门标签

归档