重用auto类型的变量

Reuse of variable of type auto

我有一个特殊的 class 用作 return 类型的方法,包含所需的值或在失败的情况下甚至从早期错误级联的错误消息。它按预期工作。

由于 returned 类型非常复杂,我喜欢使用关键字 auto。但是当使用很多方法时,我必须创建新的 return 变量。

典型的代码部分如下所示:

auto ret1 = methodA();
if(ret1.isValid()...

auto ret2 = methodB();
if(ret2.isValid()...

我不喜欢总是创建一个新变量。但我喜欢优雅的错误处理方式。使用更多转储 return 类型(如整数错误代码)可以解决问题,但我无法从错误处理 return 类型中获益。

有什么技巧可以重用第一个 return 变量 ret1 吗?

您必须创建新的作用域才能为不同的变量重用变量名,例如:

{
    auto ret = methodA();
    if (ret.isValid()) ...
}
{
    auto ret = methodB();
    if (ret.isValid()) ...
}

您还可以利用 if 创建的范围,将 init 语句放在里面:

if (auto ret = methodA(); ret.isValid()) ...

if (auto ret = methodB(); ret.isValid()) ...

auto 不是类型。

这是一个关键字,表示"put the type here for me, by deducing it from the initial value"。这发生在编译期间,一次。

您不能重复使用 ret1 来存储不同类型的对象,无论您是否使用 auto

这应该不是问题。如果您担心 "running out of names" 或 "having many similar names",您的名称描述性不够 and/or 您的范围不够严格。

I dont like to always create a new variable.

更好的方法是创建一个 const 变量:

const auto ret1 = methodA();
if(ret1.isValid()...

const auto ret2 = methodB();
if(ret2.isValid()...

在这种情况下,您需要制作 const 所有方法,如 isValid,但更好的是:"is" 不应该有副作用和修改状态。

下一步是完全删除临时变量:

if(methodA().isValid()) {
    ...
}

if(methodB().isValid()) {
    ...
}

另一种方法是将每个函数调用包装到一个块中:

{
    const auto ret = methodA();
    if(ret.isValid()...
}

{
    const auto ret = methodB();
    if(ret.isValid()...
}

这允许您重复使用 const 变量名。

每个块都成为提取到单独函数中的候选对象(参见 "Clean Code" 中的 Uncle Bob)。

auto 不是 类型。在 auto foo = bar(); 中,编译器简单地计算出 bar() 实际上是什么类型 returns 并将其替换。因此,如果 bar() returns int 那么这就是类型属于 foo,如果它 returns bool 那么 就是 foo 的类型。一旦确定了auto应该被(第一次)替换的类型,那么它就永远不会改变。 auto 并不意味着 "variable type" 它只是意味着 "hey compiler, I'm too lazy to figure out the type to put here, please do it for me",但是 与你只是写最后的相比 没有什么区别 自己打字。 因此,如果您第二次分配给变量的类型与第一次相同,则可以重用该变量 - 否则不能。