首页 > 解决方案 > 如何有条件地实例化一个对象?

问题描述

我正在尝试像这样做一些有条件的工作:

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 - 相关问题:使用默认构造函数强制声明未初始化的成员

标签: c++classoptimizationconditional-statementsinstantiation

解决方案


您可以使用 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不是默认可构造的,这也将起作用。

这是一个演示


推荐阅读