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?
您可以使用 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)
比你的好一点:你可以&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
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |