c++ - 在 C++11(或更新版本)中创建 RAII 包装器而无需编写新类的最短路径是什么?

标签 c++ c++11 c++14 c++17 raii

我经常遇到这样一种情况,我需要一个简单的 RAII 包装器,但由于时间限制和组织问题等多种原因,我不想为此创建一个全新的类。我的快速解决方案如下。

假设我想确保在范围结束时,我想要一个 bool 值切换回其原始状态:

bool prevState = currState;
currState      = newState;
std::unique_ptr<int, std::function<void(int*)>> txEnder(new int(0), [&prevState](int* p) {
    currState = prevState;
    delete p;
});

这个解决方案工作正常,但肮脏的部分是分配和释放整数的必要性只是为了使 unique_ptr 工作并在销毁时调用自定义析构函数。

有没有更简洁的方法来做到这一点,而不必编写整个类,并摆脱虚拟 intnew

最佳答案

您可以使用 BOOST_SCOPE_EXIT

auto prevState{currState};
currState = newState;
BOOST_SCOPE_EXIT(&currState, &prevState)
{
     currState = prevState;
} BOOST_SCOPE_EXIT_END

关于c++ - 在 C++11(或更新版本)中创建 RAII 包装器而无需编写新类的最短路径是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53739994/

相关文章:

c++ - 使用函数指针时成员函数的使用无效

c++ - libssh2 远程文件属性上次修改时间错误的时区

c++ - 从函数中获取参数类型列表

c++ - 我可以通过重新播种结合 random_device 和 mt19937 生成加密安全随机数据吗?

c++ - 为什么标准草案之间声明主要内容的措辞会发生变化?

c++ - 使用不同功能的队列中的打印元素不会在_start程序中全局清空队列。还有更多解释吗?

android - 未定义对 'cv::CascadeClassifier::detectMultiScale' 的引用,但其他库链接正确

C++ 11使用智能指针但得到无效指针

c++ - 显式 void 指针作为函数参数

c++ - 在 C++ 中声明 using 的位置是否有好的做法?