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

The*_*ist 10 c++ raii c++11 c++14 c++17

我常常需要一个简单的RAII包装器,但我不想为此创建一个全新的类,原因很多,包括时间限制和组织问题.我的快速解决方案如下.

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

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

这个解决方案工作正常,但脏部分是必须分配和释放该整数只是为了使unique_ptr工作和破坏时调用自定义析构函数.

有没有一个更清洁的方法来做这个,而不必写一个完整的类,并摆脱new假人int?

use*_*670 7

您可以使用 BOOST_SCOPE_EXIT

auto prevState{currState};
currState = newState;
BOOST_SCOPE_EXIT(&currState, &prevState)
{
     currState = prevState;
} BOOST_SCOPE_EXIT_END
Run Code Online (Sandbox Code Playgroud)

  • 好极了.促进.: - / (3认同)

mch*_*mch 6

比你的好一点:你可以&prevState在自定义析构函数中使用而不删除它,所以你不需要new和delete东西:

void foo(bool & currState, bool newState)
{
    bool prevState = currState;
    currState      = newState;
    std::unique_ptr<bool, std::function<void(bool*)>> txEnder(&prevState, [&prevState, &currState](bool* p) {
        currState = prevState;
    });
    cout << "currState: " << currState << endl;
}
Run Code Online (Sandbox Code Playgroud)

你也忘了currState在lambda中捕获.

这是一个例子:https://ideone.com/DH7vZu