gpt4 book ai didi

c++ - 生命周期绑定(bind)到代码块的未命名对象?

转载 作者:行者123 更新时间:2023-12-05 09:34:42 25 4
gpt4 key购买 nike

问题很简单:有时我会遇到修改某些(相当全局的)状态的情况,例如日志级别——以抢占对全局状态的提示:这不是我的框架,我对此无能为力;- ).

为了更好,我应该在完成后恢复旧状态,所以我保存它并在最后恢复它。这是 RAII 的一个明显案例:

// Some header
/// A RAII class which records a state and restores it upon destruction.
struct StateRestorer
{
State oldState;
StateRestorer(State oldStateArg) : oldState(oldStateArg) {}
~StateRestorer() { setState(oldState); }
};


// Happens a couple times somewhere in my program
{
StateRestorer oldStateRestorer(getState());
State newState(/* whatever */);
setState(newState);
// Do actually useful things during the new state

// oldStateRestorer goes out of scope and restores the old state.
}

现在,我实际上不需要 oldStateRestorer 变量。不要误会我的意思,我确实需要它所指的对象;但我从不以任何方式访问 oldStateRestorer。需要给它起个名字有点麻烦。如果我一个人,我可能会称它为 s,但我坚决支持良好的命名,以便不熟悉该程序的人(可能是两年后的我)可以很容易地理解它。有时这些状态变化是嵌套的,所以我必须发明新名称,以免我的编译器警告我我正在隐藏另一个变量(在其他情况下这是一个严重的警告,我不喜欢开始的警告,现在我都很不高兴)。正如我所说,有点烦人。

问题归结为:

有没有办法在 C++ 中拥有一个生命周期为一段代码的未命名对象?

(如果有人觉得有必要用他们最喜欢的不同语言举个例子,我不介意。)

最佳答案

Is there a way to have an unnamed object with automatic storage duration in C++?

技术上没有。然而,临时对象非常相似:它们没有命名并且会自动销毁。此外,可以通过绑定(bind)对它的引用来延长临时对象的生命周期:

struct silly_example {
T&& ref;
}

int main()
{
silly_example has_automatic_storage {
.ref = T{}; // temporary object
};
}

在这个例子中,我们有一个具有自动存储的命名对象,它引用一个(n 未命名的)临时对象,其生命周期与自动对象的生命周期匹配。

我认为这对您描述的情况没有用。


请注意,这是此类 RAII 类型的典型问题。标准库中的一个示例是 std::lock_guard :

std::mutex some_mutex;

{
const std::lock_guard<std::mutex>
must_have_a_name(some_mutex);

// critical section which won't refer to the guard
}

最糟糕的不是你必须想出一个名字,而是const std::lock_guard<std::mutex> (some_mutex);是一个有效的函数声明,将在不创建守卫的情况下成功编译。


(If somebody felt compelled to give an example in their favorite different language I wouldn't mind though.)

Python 特别优雅。因为它没有析构函数,所以它一开始就不能有这样的 RAII 类型。

some_mutex = Lock()

with some_mutex:
# critical section here

可与 with 一起使用的类使用普通函数(具有特定名称)而不是构造函数和析构函数:

class WithExample: 
def __init__(self, args):
pass

def __enter__(self):
# resource init
# may return something to be used within the scope
pass

def __exit__(self):
# reource release
pass

关于c++ - 生命周期绑定(bind)到代码块的未命名对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66389288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com