如何在没有已知初始值的情况下处理原始类型的声明(C++)?

h22*_*h22 6 c++ design-patterns

在某些情况下,我会在不先知道变量值的情况下声明变量,例如:

int a;
if (c1) {
  a = 1;
} else if (c2) {
  a = 2;
} else if (c3) {
  a = -3;
} 
do_something_with(a);
Run Code Online (Sandbox Code Playgroud)

无论如何分配一些明显错误的值-1000(使潜在的错误更容易重现)是标准的专业实践吗?还是最好不要添加只要没有错误就没有任何用处的代码?从一方面来看,消除随机性看起来很合理,但从另一方面来看,神奇的甚至“明显错误”的数字在某种程度上看起来并不有吸引力。

在许多情况下,可以在第一次知道值时进行声明,或者使用三元运算符,但在这里我们需要它嵌套,所以也相当笨拙。

在块内声明会过早地将变量移出作用域。

或者这种情况会证明稍后使用std::optional<int> a和 是合理的assert(a),以确保我们具有价值吗?

编辑:如果突然所有 3 个条件都为假,我正在谈论的错误就会发生,而这应该“绝对不会发生”。

bar*_*top 5

据我所知,最流行和最安全的方法是使用内联 lambda 调用。请注意,if应该是详尽的(我添加SOME_DEFAULT_VALUE为占位符)。我想,如果您不知道在最后一个块中放置什么,else您应该考虑以下几个选项:

  • 使用optionalnone放入else,
  • 抛出描述问题的异常,
  • 如果从逻辑上讲assert这种情况永远不应该发生
const int a = [&] {
  if (c1) {
    return 1;
  } else if (c2) {
    return 2;
  } else if (c3) {
    return -3;
  } else {
    return SOME_DEFAULT_VALUE;
  }
}();
do_something_with(a);
Run Code Online (Sandbox Code Playgroud)

在初始化逻辑在某处重复的情况下,您可以简单地将 lambda 提取到命名函数,如其他答案所建议的那样

  • 落在未处理的情况下也可能是“断言”或“抛出”的地方。 (3认同)

Att*_*tis 3

我会引入一个默认值。我通常为此使用类型的最大值。

最短的是,您可以使用三元运算符来完成此操作,如下所示:

#include <climits>

int a = c1 ? 1 : c2 ? 2 : c3 ? -3 : INT_MAX;

do_something_with(a);
Run Code Online (Sandbox Code Playgroud)