Apple Blocks vs C++ 11 Lambdas

Dir*_*irk 3 c++ lambda block objective-c c++11

我一直在玩C++ 11和Apple块,我试图创建一种interator函数.代码:

#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);
    });
}
Run Code Online (Sandbox Code Playgroud)

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

0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*oun 6

直接从来源引用:

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

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

然后他们继续说明:

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

他们提供以下代码示例:

__block int anInteger = 42;

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

anInteger = 84;
testBlock(); // Prints "Integer is: 84"
Run Code Online (Sandbox Code Playgroud)

我建议你坚持使用Lambdas.