使用块或C ++ lambda作为C函数指针API

时间:2016-06-27 20:08:15

标签: c++ c lambda javascriptcore

使用JavaScriptCore的C API,我有这个C函数指针签名:

typedef void
(*JSObjectInitializeCallback) (JSContextRef ctx, JSObjectRef object);

这是一个有问题的用法:

JSClassDefinition def = kJSClassDefinitionEmpty;
// This is that previously typed out signature being used
def.initialize = [](JSContextRef ctx, JSObjectRef obj){
  CAMLlocal2(init_context, init_obj);

  init_context = caml_alloc(sizeof(JSContextRef), Abstract_tag);
  init_obj = caml_alloc(sizeof(JSObjectRef), Abstract_tag);
  Store_field(init_context, 0, (value)ctx);
  Store_field(init_obj, 0, (value)obj);
  // Need to call this but can't because class_def is 
  // from the outside and can't be put in the capture list
  //caml_callback2(Field(class_def, 5), init_context, init_obj);
};

所以我不确定解决这个问题的正确方法是什么。我不想开始在所有地方开始定义C函数,因为我需要动态创建这些回调并且我不确定如何正确地执行全局状态解决方案,因为这将引入更多正确锁定的问题,等等。 我也愿意使用Objective-C块,只是块,没有Objective-C。看到std::function的一些提及,但我不太了解C ++使用该API。

浏览JSC顶部的Apple Objective-C层,看看他们是如何做到的......

EDIT1:找到此链接作为可能的解决方案,http://p-nand-q.com/programming/cplusplus/using_member_functions_with_c_function_pointers .html但它在C ++知识方面相当深入,我的知识有限。

EDIT2:我想我需要一些模板魔法为我生成代码?

0 个答案:

没有答案
相关问题