我有一个带有unique_ptr成员的类.
class Foo {
private:
std::unique_ptr<Bar> bar;
...
};
Run Code Online (Sandbox Code Playgroud)
Bar是第三方类,具有create()函数和destroy()函数.
如果我想std::unique_ptr在独立功能中使用它,我可以这样做:
void foo() {
std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); });
...
}
Run Code Online (Sandbox Code Playgroud)
std::unique_ptr作为班级成员,有没有办法做到这一点?
在测试代码中,我偶尔想设置/模拟一些全局变量,在测试/范围结束时我想恢复这些变量。例如:
BOOST_AUTO_TEST_CASE(HttpClientCsrf)
{
std::string csrfSave = Http::getCsrfToken();
... some test code
Http::setCsrfToken(csrfSave); // restore csrf
}
Run Code Online (Sandbox Code Playgroud)
这里明显的问题是,如果some test code在到达结束之前返回(或抛出),您将不会恢复该csrfSave变量。因此,简单的改进是编写一些简单的结构包装器来自动恢复 dtor 中的值:
struct CsrfSave
{
std::string csrfSave;
CsrfSave()
{
csrfSave = Http::getCsrfToken();
}
~CsrfSave()
{
Http::setCsrfToken(csrfSave);
}
};
BOOST_AUTO_TEST_CASE(HttpClientCsrf)
{
CsrfSave csrfSave;
... some test code
// dtor of CsrfSave restores csrf
}
Run Code Online (Sandbox Code Playgroud)
这通常解决了问题,但是,对于每个函数,您都需要编写大量样板代码。所以,问题是:什么是最短和最简单的方法可以用来实现相同的目标,同时最小化并可能避免所有的样板文件。
我使用的一种这样的方法,我对此不太满意:
BOOST_AUTO_TEST_CASE(HttpClientCsrf)
{
std::string csrfSave = RBX::Http::getLastCsrfToken();
shared_ptr<void> csrfSaveScope(NULL, [&](void*) {
RBX::Http::setLastCsrfToken(csrfSave);
});
... some test code
}
Run Code Online (Sandbox Code Playgroud)
有更好的吗?我宁愿避免编写任何实用程序类,并且宁愿避免 boost (除非它包含在下一个 std 中)。这种模式经常发生在不同的项目(不共享代码)中,每次我最终编写使用 …