- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我写了一个作用域守卫,它在作用域退出时重置一个值:
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 保存到局部变量,否则它会立即重置该值。
我正在编写一个库来格式化和操作字符串。我有一个全局变量来控制 float 的格式。我知道全局变量通常是个糟糕的主意,但请多多包涵。
我决定谨慎使用全局变量。使用全局变量的替代方法是传递包含格式规范的对象。这个选项最终被证明是不可行的:我的库旨在与任何提供到 std::string
的隐式转换的对象一起使用。无法将格式化选项(或任何参数,实际上)传递给隐式转换函数。因此,我不得不求助于使用全局变量。
最佳答案
在回答您的问题之前,我想提供在 C++ 中解决此问题的正确方法。
template <class T>
struct [[nodiscard]] ResetGuard
{
T old_value;
T& obj_to_reset;
bool enabled{true};
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(ResetGuard &&rhs)
: old_value(rhs.old_value)
, obj_to_reset(obj_to_reset)
{
rhs.enabled = false;
}
~ResetGuard()
{
if (enabled)
obj_to_reset = old_value;
}
ResetGuard(const ResetGuard &) = delete;
ResetGuard &operator=(const ResetGuard &) = delete;
ResetGuard &operator=(ResetGuard &&) = delete;
};
void foo() {
auto guard = temporarily_set_global_value(15);
std::cout << "GLOBAL_VALUE is " << GLOBAL_VALUE << std::endl;
}
上面的代码包含几个有趣的元素:
作为额外说明,我想将注意力集中在 C++17 扩展(以前允许优化)上,它称为 Guaranteed Copy/Move Elision .这将确保在实践中不会存在额外的临时实例。
回到你的问题:有什么方法可以延长 C++ 中临时对象的生命周期吗?
是的,感谢 N0345 (1993 年的提案)。该提案允许通过常量引用捕获临时对象来对其进行扩展。
const auto &guard = temporarily_set_global_value(15);
但是,我不清楚您总共有多少个实例。但是,如果您将解决方案与移动构造函数一起使用,这将不再是问题。此外,当您使用编译器优化时,此函数可以在 header 中实现时内联。这可以消除所有拷贝。
关于c++ - 有没有办法延长 C++ 中临时对象的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51120948/
我有一个网站,用户可以在其中提交游戏报告。我目前结合使用 markdown 和 HTMLPurifier 来允许有限的标记。 我想添加内联照片支持,从用户图库中绘制图像。 我用一些 JS 构建了一个图
Name = (src.Client.Account.Rank > 65 ? src.Client.Account.Rank > 2 ? "$" : "@" : "") + src.Name, 这
在下面的例子中: http://coliru.stacked-crooked.com/a/7a1df22bb73f6030 struct D{ int i; auto test2
有没有办法延长 Firebase SMS 的过期时间?似乎只有一分钟左右有效,有时需要比这更长的时间才能收到短信。 更新:我正在通过 Web API 发送短信 最佳答案 将此视为目前的最新答案,今天已
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我正在绘制相同的 密度图 使用 基础绘图系统和 ggplot2 . 中的密度图基础绘图系统有光滑的尾部: d = density(iris$Sepal.Length) plot(d) 中的密度图ggp
大家好,我认识的每个人都问这个问题很基础而且很愚蠢,但这个问题让我很烦。如果我有以下代码。 var timerVal = 900000 function myFunction() { setTim
当我在 Rust 0.12.0 中编译以下代码时,出现以下错误: error: borrowed value does not live long enough let _ = match re.ca
我正在尝试将一个系列解析为 token 树,但是当我尝试实现我的解析特征时,我收到了与引用生命周期相关的错误。我认为创建一个盒装版本可以解决任何与引用计数或生命周期有关的问题。代码如下。 impl P
当我在 Rust 0.12.0 中编译以下代码时,出现以下错误: error: borrowed value does not live long enough let _ = match re.ca
我在方法中有以下代码: int64_t delayInSeconds = 2.0f; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
当我按下主页按钮时,我的应用程序正确暂停,但只持续几分钟。如果我离开它一会儿然后返回它,应用程序会重新启动。 我没有在我的应用程序中运行任何后台任务,其他应用程序保持暂停状态的时间比我的要长得多。 这
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我需要服务停止足够长的时间。大约 5-10 分钟。现在在 Windows 10 上,我的服务系统在 60 秒后终止,而没有等待它正确完成。使用网络函数 RequestAdditionalTime 看到
如何延长windows app证书的有效期?我们正在加载应用程序/主要障碍是证书每年都会过期,通过 GP 更新证书很麻烦,因为我们的环境中已经存在问题。我们希望将其延长至少 5 年。 我设法找到了关于
最近我看到了这个: 在 2037 年之前,我的任何应用都不太可能存活(而且我存活了下来,所有依赖它的东西都存活了),我的应用是否会因为需要新证书而必须使用新的包名称重新发布? 没有办法延长证书吗? 最
有什么方法可以延长 keystore 或证书的时间有效性吗? 我已经创建了一个有效期为 10 年的 keystore 。但是,由于谷歌市场的限制,我需要 30 年的有效期。 最佳答案 证书有效性是证书
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SSC
我 3 天前注册了 30 天的 Azure 试用版。我有 2 个虚拟机。今天,我的管理门户中弹出 2 条消息。 您的免费试用将在 25 天后到期。单击此处立即升级。 根据您的使用历史记录(21.52
我是一名优秀的程序员,十分优秀!