【发布时间】:2017-10-07 13:07:00
【问题描述】:
已经有大量的示例/代码展示了如何将函数作为回调传递给 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 中重写上述代码? 我的回调将被调用到调用者函数中,以便它使用调用者函数本地变量。我知道 C++11 的 Lambda、std::function、std::bind,但不知道如何实现。
任何帮助将不胜感激。
【问题讨论】:
-
我写的这篇文章你可能会感兴趣:vittorioromeo.info/index/blog/…
-
您是否尝试在调用 GCD 时将 obj-c 闭包替换为 c++ lambda,或者更一般地? GCD 有一个 c 风格的回调接口以及一个基于闭包的回调接口。您可以将闭包对象的地址和函数指针传递给其静态函数。这可以包装在回调函数对象中。
-
我不了解 Objective-C,但在我看来,您想要的可以通过
[&]lambda 捕获来实现。
标签: c++ objective-c c++11 callback asynccallback