通用目标到C++;翻译策略 我想把Objc通知处理程序暴露给我的C++客户端代码。 我是这样做的 我在一个C++对象中封装了一个Objc对象(称为Stista> x)。 X观察通知并注册回调(称之为F) >强> f>强>将Objc结构从通知转换为它们的C++对应,调用用户注册的全局C++回调函数(称为“强> FF”)。翻译后的C++结构成为 < F> > /LI>的输入参数。

通用目标到C++;翻译策略 我想把Objc通知处理程序暴露给我的C++客户端代码。 我是这样做的 我在一个C++对象中封装了一个Objc对象(称为Stista> x)。 X观察通知并注册回调(称之为F) >强> f>强>将Objc结构从通知转换为它们的C++对应,调用用户注册的全局C++回调函数(称为“强> FF”)。翻译后的C++结构成为 < F> > /LI>的输入参数。,c++,ios,objective-c,C++,Ios,Objective C,现在的问题是参数的原始ObjC结构很复杂,包含需要翻译的多层ObjC对象 在我这方面,包装器观测者F不需要做任何特殊的事情,只需调用客户端的FF 在这一点上,我更合适的翻译策略是什么 我应该: 将这些结构转换为所有成员的底层,这样我就有了等价的C++结构作为参数使用,或者, 创建一个C++类,将这些参数封装到一个对象中,并将类接口暴露给用户,以便他们在C++实现中使用那些C++包的参数,或者, 放弃包装的想法,让用户在ObjC中编码并直接注册他们自己的观察者函数 我的目标用户是iOS开发人员,他

现在的问题是参数的原始ObjC结构很复杂,包含需要翻译的多层ObjC对象

在我这方面,包装器观测者F不需要做任何特殊的事情,只需调用客户端的FF

在这一点上,我更合适的翻译策略是什么

我应该:

  • 将这些结构转换为所有成员的底层,这样我就有了等价的C++结构作为参数使用,或者,
  • 创建一个C++类,将这些参数封装到一个对象中,并将类接口暴露给用户,以便他们在C++实现中使用那些C++包的参数,或者,
  • 放弃包装的想法,让用户在ObjC中编码并直接注册他们自己的观察者函数

  • <>我的目标用户是iOS开发人员,他们可能是也可能不是Android开发人员。

    你可以在.mm实现文件中混合C++和ObjuleC++。这意味着你可以给C++ C++类的C++ LAMBDA(或块)提供引用。 大概是这样的:

    实施.mm:

    @interface Shim : NSObject
    {
      std::function<void>() _notify;
    }
    @end
    
    @implementation Shim
    - void register_cpp(std::function<void>() f)
    {
      _notify = std::move(f);
    }
    
    - (void) my_handler()
    {
      if(_notify)
        _notify();
    }
    @end
    
    struct cpp_class::impl {
      impl()
      : _shim([Shim alloc[init]])
      {
        _shim.register_cpp(std::bind(&impl::callback, this));
      }
    
    private:
      void callback() {
        // do callback here;
      }
      Shim* _shim;
    };
    
    cpp_class::cpp_class()
    : _impl(new impl)
    {
    }
    
    cpp_class::~cpp_class()
    {
      delete _impl;
    }
    
    实际上,您需要小心确保在执行回调时对象仍然存在(主张弱_ptr::lock()、从_this启用_shared_等等),因为objective-c喜欢将回调放在线程的运行循环(基本上是一个队列)上这意味着C++对象可以在回调到达之前离开,但是这个代码应该给你正确的想法。
    struct cpp_class{
      cpp_class();
      ~cpp_class();
    
    private:
      struct impl;
      impl* _impl;
    };