c++ - 如何在 C++ 中创建带返回值的内联作用域?

标签 c++ lambda scope

我有一个更大的 if 表达式,让我们说一下吧

if (a && (c(b.getObject()) || d(b.getObject()))
{
    ...
}

有没有办法仅当 atrue 时才将 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/

相关文章:

c++ - 在头文件中使用 lambda 会违反 ODR 吗?

在 if 语句中调用方法会分解变量

go - Go中的函数调用函数

c++ - 如何在 unique_ptr 之间移动所有权

c++ - 为什么 auto_ptr 行为异常

c++ - Win32 共享内存的包装类? (进程间通信)

c# - 什么是 LINQ/Lambda 等价于 Select Count(*), SUM(someColumn) From SomeTable

c++ - 几个用于重新定义 vector 排序函数顺序的仿函数

c++ - 将 lambdas 传递给 std::thread 并调用类方法

javascript - 未定义值、变量范围问题