如何在c ++中创建具有返回值的内联作用域?

时间:2014-02-25 15:02:26

标签: c++ lambda scope

我有一个更大的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块。

3 个答案:

答案 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); }() ) {
    ...
}

但声明在条件之外的功能似乎更清晰。