【问题标题】:Equivalent of Swift trailing closure in C++等效于 C++ 中的 Swift 尾随闭包
【发布时间】:2018-03-27 07:13:59
【问题描述】:

在Swift中,当我们需要将闭包作为函数的参数传递时,如果闭包是最后一个要传递的参数,我们可以在调用函数的最后一个括号)之后指定闭包体,即称为a尾随闭包。

Swift 示例:

func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

// Here's how you call this function without using a trailing closure:

someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

// Here's how you call this function with a trailing closure instead:

someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

有时在 C++ 中,当我使用 std::sort 并传递一个闭包时,如果我使用等效于 Swift 尾随闭包的代码,则代码将更具可读性。 我对 C++ 11 之后的 C++ 标准的经验很少,你知道 C++ 中是否有类似的东西?

【问题讨论】:

  • 您能否在C++ 中发布您想做的真实(工作)示例?
  • 不,而且 C++ 有不同的 lambda 语法,所以会引入不一致。

标签: c++ swift lambda closures


【解决方案1】:

这是最简单的 C++ 等价物:

void someFunctionThatTakesAClosure(std::function<void()> closure) {
    // function body goes here
}

someFunctionThatTakesAClosure([] {
    // code comes here
});

C++ 不会预测尾随闭包之类的东西。

请注意,在 C++ 中,(lambda) capturing is not implicit 就像在 Swift 或 Objective C 中一样,您必须说明应该捕获的内容:

int copyVar = 0;
int refVar = 1;
someFunctionThatTakesAClosure([copyVar, &refVar] {
    // code comes here
    refVar += copyVar;
});

还有一个疯狂的捕获,可以让它像在 Swift 或 Objective C 中一样工作,但根据我的经验,最好说明捕获的内容和方式,在许多情况下,它使我免于创建不需要的引用循环,什么有时在 Objective C 中发生在我身上(隐式使用 self)。

请注意,在 Objective C++ 中,块可以用作 C++ 参数,所以这也可以:

someFunctionThatTakesAClosure(^{
    // mixed C++/Objective C code comes here
});

更高级的方法涉及使用 C++ 模板,但我认为您不需要。

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2018-07-31
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多