相关疑难解决方法(0)

Objective-C++ 11 - 为什么我们不能将块分配给lambda?

所以,我刚刚升级到Xcode 4.4,我注意到在更改日志中:

Apple LLVM编译器支持其他C++ 11功能,包括lambdas

哪个太棒了!所以我开始编码,我找到了一些东西:

  1. Lambdas可分配给Objective-C块:

    void (^block)() = []() -> void { 
        NSLog(@"Inside Lambda called as block!");
    };
    
    block();
    
    Run Code Online (Sandbox Code Playgroud)
  2. std::function 可以持有Objective-C块:

    std::function<void(void)> func = ^{
        NSLog(@"Block inside std::function");
    };
    
    func();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我们不能将一个Objective-C块分配给lambda:

    auto lambda = []() -> {
        NSLog(@"Lambda!");
    };
    
    lambda = ^{ // error!
        NSLog(@"Block!");
    };
    
    lambda();
    
    Run Code Online (Sandbox Code Playgroud)

为什么是这样?鉴于我们上面所看到的,这两者在语义上是否应该是等价的?

c++ lambda objective-c objective-c++ c++11

15
推荐指数
1
解决办法
3554
查看次数

C++ 0x Lambda到VS 2010中的函数指针

我试图使用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)

c++ lambda visual-studio-2010 c++11

10
推荐指数
1
解决办法
8022
查看次数