我有一个更大的if
表达式,可以说是那种
if (a && (c(b.getObject()) || d(b.getObject()))
{
...
}
只有在b.getObject()
为a
时,才能将true
声明为本地参考吗?
我正在寻找一种像这样的lambda函数:
if (a && { Object & o(b.getObject()); return (c(o) || d(o))} )
{
...
}
但这显然不起作用。
当然我可以将它嵌套在另一个if
区块中,但是有更“本地化”的方式吗?
编辑:
针对嵌套if
块的一个参数是它们不允许一个组合else
块。
答案 0 :(得分:4)
定义执行两项检查的函数,并调用它以便您只评估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
比其他任何一种选择都更清晰,更容易阅读。
答案 1 :(得分:0)
请不要这样做,但它有效......
Object x;
if (a && (x = b.getObject(), c(x) || d(x)))
{
}
答案 2 :(得分:0)
您可以使用lambda:
if (a && [&b](){ const Object& o = b.getObject(); return c(o) || d(o); }() ) {
...
}
但声明在条件之外的功能似乎更清晰。