【发布时间】:2015-06-29 17:06:30
【问题描述】:
我有以下代码:
MyType x = do_something_dangerous();
// ...
if (some_condition) {
// ...
bar(x);
}
else {
// ...
}
// ...
if (another_condition_which_may_depend_on_previous_if_else} {
// ...
baz(x);
}
这个想法是,在某些情况下,可能很难/不方便提前确定,我需要使用x。但在我不需要使用它的情况下,尝试初始化它可能会很糟糕(比如说,可能会使我的进程崩溃)。
现在,看来我需要使用的是initialize-on-demand holder(链接侧重于Java,所以这是一个草图):某种Wrapper<MyType> 或Wrapper<MyType, do_something_dangerous> 与get() 方法,例如第一个 get() 调用 do_something_dangerous() 和后来的 get()s 只是传递第一个调用获得的值。
- 这确实是一种合适的方法吗?
- 这个成语是否有一些标准(ish)实现,或者它的变体?
注意事项:
- 我可以使用
boost::optional,但这会有点麻烦并且还会扭曲预期用途:“建议在只有一个明确(对所有各方)理由的情况下使用optional<T>没有T类型的值,并且缺少值与具有任何常规值T一样自然。"
【问题讨论】:
-
也许是
boost::optional或std::experimental::optional? -
我认为您正在寻找的术语是记忆,这是另一个可能有帮助的问题:stackoverflow.com/questions/17805969/…
-
我不太清楚所需的工作流程:什么是危险的:调用
do_something_dangerous(),如果该函数失败,则初始化x,如果该函数使用x失败的。 x 是否可以默认初始化(或等效的东西)以使其无害且可检测?