相关疑难解决方法(0)

如何将自定义删除器与std :: unique_ptr成员一起使用?

我有一个带有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作为班级成员,有没有办法做到这一点?

c++ unique-ptr move-semantics c++11

122
推荐指数
7
解决办法
9万
查看次数

在函数作用域末尾执行代码的简单方法

在测试代​​码中,我偶尔想设置/模拟一些全局变量,在测试/范围结束时我想恢复这些变量。例如:

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 中)。这种模式经常发生在不同的项目(不共享代码)中,每次我最终编写使用 …

c++

3
推荐指数
2
解决办法
1942
查看次数

标签 统计

c++ ×2

c++11 ×1

move-semantics ×1

unique-ptr ×1