Apple Blocks vs C ++ 11 Lambdas

时间:2014-12-23 20:44:36

标签: c++ objective-c c++11 lambda block

我一直在玩C ++ 11和Apple模块,我试图创建一种互动功能。代码:

#include <functional>
#include <stdio.h>

void range(int low, int high, int& ref, std::function<void(void)> block){
    int a = low;
    while(a < high){
        ref = a;
        block();
        a++;
    }
}

void range(int low, int high, int& ref, void (^block)(void)){
    int a = low;
    while(a < high){
        ref = a;
        block();
        a++;
    }
}

int main(){
    int a = 0;
    range(0, 5, a, [&](){
        printf("%i\n", a);
    });

    int b = 0;
    range(0, 5, b, ^(){
        printf("%i\n", b);
    });
}

第一个,使用C ++ 11 Lambdas按预期工作,并提供以下输出

0
1
2
3
4

第二个,使用Apple Blocks API,提供5个零,是否有任何方法可以使它适用于块?

1 个答案:

答案 0 :(得分:6)

直接从source引用:

  

除非您另行指定,否则仅捕获该值。这意味着如果在定义块的时间和调用块的时间之间更改变量的外部值,则块捕获的值不受影响。

捕获的值是int b的副本,其初始值为0

然后他们继续指定:

  

如果您需要能够在块中更改捕获变量的值,则可以在原始变量声明中使用__block存储类型修饰符。

他们提供以下代码示例:

__block int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;
testBlock(); // Prints "Integer is: 84"

我建议你坚持使用Lambdas。