我有一个更大的 if
表达式,让我们说一下吧
if (a && (c(b.getObject()) || d(b.getObject()))
{
...
}
有没有办法仅当 a
为 true
时才将 b.getObject()
声明为本地引用?
我正在寻找一种可能像这样的 lambda 函数:
if (a && { Object & o(b.getObject()); return (c(o) || d(o))} )
{
...
}
但这显然行不通。
当然,我可以将它嵌套在另一个 if
block 中,但是有没有更“本地”的方法来做到这一点?
编辑:
反对嵌套 if
block 的一个论点是它们不允许组合一个 else
block 。
最佳答案
定义一个执行两项检查的函数,然后调用它,这样您只需计算 b.getObject()
一次。
auto e = [](const Object& o) { return c(o) || d(o); };
if (a && e(b.getObject()))
{
...
}
在 C++11 之前,您必须将 e
编写为命名空间范围内的函数,或使用 operator()
编写为本地类类型的变量.
此外,G++ 有一个非标准 "statement expression"允许您想要的扩展,语法略有不同:
if (a && ({ const Object& o = b.getObject(); c(o) || d(o); }))
{
...
}
但是,我认为通常嵌套的 if
比这些替代方案中的任何一个都更干净、更容易阅读。
关于c++ - 如何在 C++ 中创建带返回值的内联作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22018036/