unique_ptr作为通用处理对象



假设我有一种情况,我有一个SDK,它提供了特定的接口,这意味着一些手动资源管理或状态更改。它应该这样使用:

// SDK has state B by default
SDK->setStateA();
something();
requiring();
stateA();
SDK->setStateB();

将状态更改封装为unique_ptr对象的自定义分配器/删除器是个好主意吗?或者,最好通过一些手动Dispose模式实现来获得这种行为。

由于这不是资源分配,我对此表示怀疑。它可能会引起混乱,并使代码变得神秘。

我的另一个担忧是,我需要init和cleanup步骤的返回代码。我可以使用lambdas并通过捕捉获得这些,但它看起来更神秘。

也许有人已经尝试过了,过了一段时间后看到了它是如何使代码看起来的?

通常,最好以易于使用和直观的方式设计代码的接口,或者换句话说,很难错误地使用它。特别是,如果接口能够通过拒绝编译来防止错误,则可以节省大量调试时间。

实现这种接口的一种可能性是可以与CCD_ 1&lt--->std::unique_lock力学:

class state_guard {
std::unique_ptr<SDK_type>& SDK;
state_guard(std::unique_ptr<SDK_type>& s) : SDK{ s } {
SDK->setStateA();
}
~state_guard() {
SDK->setStateB();
}
};
void something(state_guard&, ...);
void requiring(state_guard&, ...);
void stateA(state_guard&, ...);
std::unique_ptr<SDK_type> SDK{ get_sdk() };
{
state_guard guard{ SDK };
something(guard, ...);
requiring(guard, ...);
stateA(guard, ...);
}

通过强制将保护作为函数参数传递(即使它在相应的函数中未使用(,用户不会忘记设置为状态a(多亏了RAII,将其重置为状态B(。

最新更新