Haskell FFI:你如何包装C ++集合?

我有一个函数返回vector<MyClass> ; 把这个变成适合FFI的最好方法是什么?

:: [CIntPointer]一个类型:: [CIntPointer]可能是一个很好的妥协,如果可能获得。


你可以定义你自己的C函数来分配,释放,插入,删除等。这些函数可以包装你想要访问的C ++容器。 例如:

extern "C" {

Obj * obj_create()
{
  return new Obj();
}

void obj_destroy(Obj * schema)
{
  delete obj;
  obj = NULL;
}
...
...
}

然后在FFI中声明它们并以任何你想要的方式将它们包裹起来。

data SomeObject

type Obj = Ptr SomeObject

foreign import ccall unsafe "obj_create"
    createObj :: IO Obj

foreign import ccall unsafe "obj_destroy"
    destroyObj_ :: Obj -> IO ()

foreign import ccall unsafe "&obj_destroy"
    destroyObj :: FunPtr (Obj -> IO ())

一些问题:

  • 确保使用c ++编译器(g ++而不是gcc)编译C文件。 这将确保stdc ++库被正确拾取。
  • 在编译haskell端的程序/ lib时,传递库位置(-L)和libs(-lboost *)以链接进来
  • 链接地址: http://www.djcxy.com/p/10503.html

    上一篇: Haskell FFI: How do you wrap C++ collections?

    下一篇: Hair removal algorithm development