我写了一个作用域保护器,当作用域退出时重置一个值:
现在的写法是,调用其中一个函数的任何人都需要记住将ResetGuard保存到本地变量中,否则它会立即重置该值。
一些背景信息:我正在编写一个库来格式化和操作字符串。我有一个全局变量控制浮点数的格式。我知道全局变量通常是一个糟糕的想法,但请忍耐一下。
我仔细考虑了使用全局变量的决定。使用全局变量的替代方案将是传递包含格式规范的对象。但这个选项最终被证明是不可行的:我的库旨在与提供对std :: string的隐式转换的任何对象一起工作。无法将格式选项(或任何参数)传递给隐式转换函数。因此,我不得不采用全局变量。
template <class T>
struct ResetGuard
{
T old_value;
T& obj_to_reset;
ResetGuard(T& obj_to_reset, const T& new_value) :
old_value(obj_to_reset),
obj_to_reset(obj_to_reset)
{
obj_to_reset = new_value;
}
~ResetGuard() { obj_to_reset = old_value; }
};
当这个作用域保护器从函数返回时,如果没有被保存,有没有办法防止它立即被销毁?
例如:
int GLOBAL_VALUE = 0;
ResetGuard<int> temporarily_set_global_value(int new_val) {
return { GLOBAL_VALUE, new_val }; //updates the global variable
}
void foo() {
//Ideally, someone calling this function
//Wouldn't have to save the returned value to a local variable
temporarily_set_global_value(15);
std::cout << "GLOBAL_VALUE is " << GLOBAL_VALUE << std::endl;
}
现在的写法是,调用其中一个函数的任何人都需要记住将ResetGuard保存到本地变量中,否则它会立即重置该值。
一些背景信息:我正在编写一个库来格式化和操作字符串。我有一个全局变量控制浮点数的格式。我知道全局变量通常是一个糟糕的想法,但请忍耐一下。
我仔细考虑了使用全局变量的决定。使用全局变量的替代方案将是传递包含格式规范的对象。但这个选项最终被证明是不可行的:我的库旨在与提供对std :: string的隐式转换的任何对象一起工作。无法将格式选项(或任何参数)传递给隐式转换函数。因此,我不得不采用全局变量。
struct [[nodiscard]] ResetGuard
? - melpomene