相当于 C++ 中的 Swift 尾随闭包

Equivalent of Swift trailing closure in C++

本文关键字:闭包 Swift C++ 中的 相当于      更新时间:2023-10-16
在 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++比 C++11 更新的标准几乎没有经验,你知道C++是否有类似的标准吗?

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

void someFunctionThatTakesAClosure(std::function<void()> closure) {
    // function body goes here
}
someFunctionThatTakesAClosure([] {
    // code comes here
});

C++不会预测尾随平仓之类的事情。

请注意,在C++中,块(lambda)捕获不像在Swift或Objective C中那样隐式,你必须说明应该捕获什么:

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

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

请注意,在目标C++块可以用作C++参数,因此这也将起作用:

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

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