重用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",但是 与你只是写最后的相比 没有什么区别 自己打字。
因此,如果您第二次分配给变量的类型与第一次相同,则可以重用该变量 - 否则不能。
我有一个特殊的 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",但是 与你只是写最后的相比 没有什么区别 自己打字。
因此,如果您第二次分配给变量的类型与第一次相同,则可以重用该变量 - 否则不能。