在Swift中,当我们需要传递一个闭包作为函数的参数时,如果闭包是要传递的最后一个参数,我们可以在调用函数的最后一个括号)
之后指定闭包体,即称为尾随闭包。
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 ++中是否有类似的东西吗?
答案 0 :(得分:1)
这是最简单的C ++等价物:
void someFunctionThatTakesAClosure(std::function<void()> closure) {
// function body goes here
}
someFunctionThatTakesAClosure([] {
// code comes here
});
C ++不会预测尾随闭包等内容。
请注意,在C ++中,像在Swift或Objective C中一样阻塞(lambda) capturing is not implicit,你必须说明应该捕获的内容:
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 ++模板,但我认为您不需要。