从Objective-C向C++方法传递一个块

19
我有一个C++帮助类,我将其与Objective-C一起使用。我想传递一个块给c++类(回调),以便在执行时我在主线程上,并且可以更新UI。我目前正在使用函数指针和performSelector来实现类似的系统,当调用函数时使用。我想要一个设置c++变量和传递objective-C块给它并从c++类调用它的示例。
如果这不可能,请考虑另一种/更好的解决方案吗?

你为什么认为你不能将代码块作为参数传递给C++对象的方法之一呢? - JeremyP
我一直在尝试,只需要理清语法,这就是这个问题的关键。 - Aran Mulholland
2个回答

15

那么,你是不是对块语法并不十分熟悉?如果是这样的话,下面有一个快速示例,如果你已经熟悉函数指针(语法基本相同,但使用^来声明一个 [当然,创建闭包是不同的]),应该能够理解。

你可能想为块类型设置一个typedef,以便节省重复输入相同内容的时间,但我同时提供了使用typedef和直接将块类型放在参数中的示例。

#import <Cocoa/Cocoa.h>

// do a typedef for the block
typedef void (^ABlock)(int x, int y);

class Receiver
{
public:
    // block in parameters using typedef
    void doSomething(ABlock block) {
        block(5, 10);
    }

    // block in parameters not using typedef
    void doSomethingToo(void (^block)(int x, int y)) {
        block(5, 10);
    }
};


int main (int argc, char const *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Receiver rcv;
    // pass a block
    rcv.doSomething(^(int x, int y) { NSLog(@"%d %d", x, y); });
    rcv.doSomethingToo(^(int x, int y) { NSLog(@"%d %d", x, y); });

    [pool drain];
    return 0;
}

1
我认为他正在询问如何将一个 block 传递给 C++ 函数——而不是 Objective-C++ 函数。 - Cory Nelson
1
为什么创建闭包不同? - Aran Mulholland
@Aran-Mulholland 你确切的意思是什么?当我谈论创建闭包有何不同时,我特指 returntype ^ (parameters) { ... } 的语法,这与常规函数不同,因为我从未见过有人像这样做 doSomething(void (int x, int y) { /* some stuff */ }) 来传递函数指针给某个对象。 - user457812
+1 对于 typedef 的提示。这使得函数定义更易读。 - FRotthowe

10

请参见使用块作为函数参数。在声明方法时,请使用类似以下的语法声明块参数:

void theFunction(blockReturnType (^argumentName)(blockArgumentTypes));

块调用看起来像函数调用,因此如果要实现上面的theFunction只需调用该块并返回其结果,代码如下:

int theFunction(int anArgument, int (^theBlock)(int)) {
    return theBlock(anArgument);
}

这种语法适用于C、C++和Objective-C。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接