【发布时间】:2019-09-26 11:50:26
【问题描述】:
我制作了一个“作用域设置器”,当它超出作用域时,它会自动为变量赋值,通常是 POD。我主要使用它来跟踪执行当前是否在某个范围内。
template<typename T>
struct FScopedSetter
{
FScopedSetter(T& InObject, T InbOutOfScopeValue)
{
Object = &InObject;
bOutOfScopeValue = InbOutOfScopeValue;
}
virtual ~FScopedSetter()
{
*Object = bOutOfScopeValue;
}
T* Object;
T bOutOfScopeValue;
};
// Example:
bool bInTaskA = false;
void TaskA()
{
bInTaskA = true;
FScopedSetter<bool> Setter(bInTaskA, false);
// ..
}
稍后我决定在TaskA中添加一个额外的return语句时应该更安全,但忘记在它之前添加bInTaskA = false。
我的问题是:假设我将 FScopedSetter 对象命名为 FScopedSetter 对象,这是否正确并且它(总是)可以正常工作,至少在使用 POD 时?我有点担心编译器可能会因为未使用而决定它可以提前结束 setter 的生命周期?
谢谢!
【问题讨论】:
-
据我所知,这很好,虽然我会使用范围保护模式的一些通用实现而不是定制的。