所以,我刚刚升级到Xcode 4.4,我注意到在更改日志中:
Apple LLVM编译器支持其他C++ 11功能,包括lambdas
哪个太棒了!所以我开始编码,我找到了一些东西:
Lambdas可分配给Objective-C块:
void (^block)() = []() -> void {
NSLog(@"Inside Lambda called as block!");
};
block();
Run Code Online (Sandbox Code Playgroud)std::function 可以持有Objective-C块:
std::function<void(void)> func = ^{
NSLog(@"Block inside std::function");
};
func();
Run Code Online (Sandbox Code Playgroud)我们不能将一个Objective-C块分配给lambda:
auto lambda = []() -> {
NSLog(@"Lambda!");
};
lambda = ^{ // error!
NSLog(@"Block!");
};
lambda();
Run Code Online (Sandbox Code Playgroud)为什么是这样?鉴于我们上面所看到的,这两者在语义上是否应该是等价的?
我试图使用lambda代替函数指针,但VS2010似乎无法转换它.我试过像这样使用std :: function它崩溃了,我不知道我这样做是否合适!
#include <windows.h>
#include <conio.h>
#include <functional>
#include <iostream>
#include <concrt.h>
void main()
{
std::function<void(void*)> f = [](void*) -> void
{
std::cout << "Hello\n";
};
Concurrency::CurrentScheduler::ScheduleTask(f.target<void(void*)>(), 0);
getch();
}
Run Code Online (Sandbox Code Playgroud)
对我来说,编译器无法将这样的lambda转换为简单的函数指针,因为它没有捕获任何变量 - 我也不知道该怎么办.
每个lambda的类型是唯一的吗?所以我可以使用lambdas'类型作为模板参数来模拟一个模板函数,以生成一个可以被调用的独特静态函数,并希望优化出来?
更新
以下似乎工作,但它是否安全?
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <concrt.h>
template<typename Signature>
struct Bind
{
static Signature method;
static void Call(void* parameter)
{
method(parameter);
}
};
template<typename Signature>
Signature Bind<Signature>::method;
template<typename Signature>
void ScheduleTask(Signature method)
{
Bind<Signature>::method = method;
Concurrency::CurrentScheduler::ScheduleTask(&Bind<Signature>::Call,0);
}
void main()
{
ScheduleTask …Run Code Online (Sandbox Code Playgroud)