指向 objc 类成员方法的函数指针,用于C++

Function pointer to objc class member method, for use in C++?

本文关键字:指针 用于 C++ 函数 objc 成员方法 指向      更新时间:2023-10-16

我有一个用于网络的C++类(通过boost::asio(,它需要使用回调函数才能做任何有用的事情。我还有一个混合的Objective-C++项目,它利用了这个类。使用 objc 类单例,我的每个子类化UIViewController类都能够绑定到类实现文件中定义的标准 C/C++ 方法,而这些方法又通过单例实例调用它们各自的类成员方法:

@interface MyViewControllerClass ()
+ (instancetype)Instance;
@end
MyViewControllerClass *_MyViewControllerClass_Instance;
void cppCallback() {
    // This method gets called from the C++ class
    [[MyViewControllerClass Instance] objcCallback];
}
@implementation MyViewControllerClass
+ (instancetype)Instance {
    return _MyViewControllerClass_Instance;
}
- (void)viewDidLoad
{
    _MyViewControllerClass_Instance = self;
    // Pass &cppCallback to the C++ class here, so it can be called later
}
- (void)objcCallback {
    ;// Do something here
}
@end

尽管看起来很丑陋,但这在过去效果很好。但是现在我碰到了一堵新墙...我需要从UICollectionViewCell子类中利用C++网络类,该子类将有很多实例...这意味着使用单例将不起作用。

那么如何将指向 objc 类方法的指针作为C++参数传递呢?
我唯一的选择是为我的C++网络类编写一个完整的Objective-C包装类吗?

"函数指针"在这里是不可能的,因为你不能使用函数指针来调用实例方法(除非你使用函数指针传递实例(。

但是,您可以创建可调用的对象。

struct Callback {
    MyViewControllerClass *instance;
    void operator()() {
        [instance objcCallback];
    }
};

您也可以使用C++ lambda,它隐约等效。