C ++中Swift尾随闭包的等价

时间:2017-10-15 19:07:19

标签: c++ swift lambda closures

在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 ++中是否有类似的东西吗?

1 个答案:

答案 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 ++模板,但我认为您不需要。