c++ - 如何有条件地实例化一个对象?
问题描述
我正在尝试像这样做一些有条件的工作:
Type object;
if (cond) {
doSomeStuff();
object = getObject();
doMoreStuff();
} else {
doSomeOtherStuff();
object = getDifferentObject();
doEvenMoreStuff();
}
use(object);
我能想到解决这个问题的唯一方法是复制use
代码(实际上是我的应用程序中的内联代码)并在块object
的每个分支中声明if
。如果我想避免重复代码,我必须将它包装在一些使用函数中,就像我上面所说的那样。在实际情况下,这个use
函数可能需要 5+ 个参数来实质上继承上下文。这一切看起来都很混乱,而且无法维护。
if (cond) {
doSomeStuff();
Type object = getObject();
doMoreStuff();
use(object);
} else {
doSomeOtherStuff();
Type object = getDifferentObject();
doEvenMoreStuff();
use(object);
}
解决这个问题的最佳方法是什么?Type
没有默认构造函数,因此片段 1 无法编译。
其他一些语言支持片段 1 - 相关问题:使用默认构造函数强制声明未初始化的成员
解决方案
您可以使用 IIILE(立即调用初始化 lambda 表达式):
auto object = [&] {
if (cond) {
doSomeStuff();
auto object = getObject();
doMoreStuff();
return object;
} else {
doSomeOtherStuff();
auto object = getDifferentObject();
doEvenMoreStuff();
return object;
}
}(); // note that the lambda must be called
use(object);
即使Type
不是默认可构造的,这也将起作用。
这是一个演示。
推荐阅读
- r - 用于运行 R-Script 的 Azure ML 与 Azure 函数
- python - 如何使用 discord.py 消除 DM 中的反应
- c# - Selenium C# - Find All Links Inside an IFrame in a complex web page
- javascript - 视图中的 Asp.net Master-Detail 对象与 actionresult 中的视图模型不完全匹配
- r - For 和 If/else 循环不按我想要的方式循环
- ruby - Ruby AJAX 请求删除表行
- react-native - 使用 redux-persist 的对象的 React-Native Persist 对象
- visual-studio-2017 - VS2017 - 工具 > 选项 > 测试中缺少常规选项卡
- c# - 我想在 behnd 代码中使 datagrid 只读,但看不到该选项
- r - 使用 mle 在 R 中拟合具有潜在负基数的指数函数