我试图找出一个简单的异步请求/回调模式的C ++语法。
我有Objective-C代码,如下所示:
NSString *arg0 = @"set.x"; // a string on the heap
NSArray *args = @[arg0];
[Request requestWithArgs:args onCompletion:^(NSDictionary *response, NSError *error)
{
if(error)
{
// deal with it
}
else
{
id obj = response[arg0];
// do things with the response
}
}];
请求在completionHandler之前返回,而completionHandler块捕获对局部变量(arg0
)的引用。
在幕后,Request类将提供的匿名completionHandler添加到队列中,并在请求完成时调用它。
我在C ++中使用lambdas?只是不确定语法。如何将所有权保留或转移到传递的变量,以便在调用completionHandler时它们仍然存在?我想如果不应该将对象复制到堆上,那么传递给lambda的任何对象都需要在堆上分配?
响应字典和错误是在请求中创建的,还需要传递给completionHandler。我该如何正确地做到这一点?
谢谢!
答案 0 :(得分:0)
Lambdas是关闭的。创建lambda时在范围内的任何变量都可以通过值或引用来捕获。我不是Objective-C程序员,但我猜你在C ++中的功能大致相当于:
auto onCompletion = [&arg0](NSDictionary *response, NSError *error) {
// function body goes here
}
该代码定义了一个函数对象,它通过引用捕获arg0,接受两个参数,并且不返回任何内容。它将该函数对象分配给一个名为OnCompletion的变量。
通过引用捕获确实需要捕获的变量的生命周期至少与lambda生成的函数对象一样长。如果情况并非如此,则省略&在arg0之前,它将被值捕获。
如果需要定义带返回值的lambda,则返回类型在参数列表之后定义,前面是箭头操作符。如果它定义了一个返回int的函数,那么上面的lambda会是什么样子:
auto onCompletion = [&arg0](NSDictionary *response, NSError *error) -> int {
// function body goes here
}