2012-02-27 69 views
7

我有一個函數返回vector<MyClass>;把這個變成適合FFI的最好方法是什麼?Haskell FFI:你如何包裝C++集合?

我在想,像:: [CIntPointer]這樣的類型可能是一個很好的折中,如果可能的話可以獲得。

+0

你需要修改的哈斯克爾側的各個元素編譯程序/ lib目錄時,鏈接嗎? – 2012-02-27 12:29:07

+0

@JohnL,不,只需與他們調用函數,例如'do {a < - cpp_getVector(); forM a cpp_f}'哪裏'cpp_f :: ElementType - > IO()' – gatoatigrado 2012-02-27 19:39:27

回答

3

你可以定義你自己的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()) 

的一些陷阱:

  1. 確保您編譯C++編譯器(G ++而不是GCC)的C文件。這將確保stdC++庫被正確拾取。
  2. 傳遞庫位置(-L)和庫(-lboost *)對哈斯克爾側
+0

是的,這正是我正在做的......謝謝。 – gatoatigrado 2012-04-25 00:35:55