已经有大量的样本/代码显示如何将函数作为回调函数传递到C++ 11中的函数参数中。然后回调被调用到一个单独的函数中,而不是调用它的原始调用者函数。如何在C++ 11中创建/传递完成处理程序回调函数参数?
比方说,我已经在Objective-C的
- (void)calculateSizeWithCompletionBlock:(IPVWebImageCalculateSizeBlock)completionBlock {
dispatch_async(self.ioQueue, ^{
NSUInteger fileCount = 0;
NSUInteger totalSize = 0;
// Doing some time consuming task, that plays with some local(on this function scope) vars
if (completionBlock) {
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(fileCount, totalSize);
});
}
});
}
- (void)doSomething {
NSUInteger var1 = 0;
NSUInteger var2 = 0;
[self calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
// Here, do things with fileCount, totalSize, var1, var2
NSLog(@"fileCount: %lu, totalSize: %lu, var1: %lu, var2: %lu",(unsigned long)fileCount, (unsigned long)totalSize, (unsigned long)var1, (unsigned long)var2);
}];
}
下面的示例代码直的问题是如何能够改写C++ 11上面的代码? 我的回调将被调用到调用者函数中,以便它使用调用者函数local vars。我知道C++ 11的Lambda,std :: function,std :: bind,但不知道如何实现。
任何帮助,将不胜感激。
我写的这篇文章可能会让你感兴趣:https://vittorioromeo.info/index/blog/passing_functions_to_functions.html –
你是否试图在调用GCD或更一般地用C++ lambda替换obj-c闭包? GCD有一个c样式的回调接口以及一个基于闭包的接口。您可以将闭包对象的地址和函数指针传递给它的静态函数。这可以包装在回调函数对象中。 –
我不知道Objective-C,但在我看来,你想用'[&]'lambda捕获来实现。 – yzt