7
私はvector<MyClass>
を返す関数を持っています。これをFFIに適したものに変更するにはどうすればよいでしょうか?Haskell FFI:C++コレクションをどのようにラップしますか?
私は:: [CIntPointer]
のようなタイプは、可能な場合は、良い妥協であるかもしれないと思っています。
私はvector<MyClass>
を返す関数を持っています。これをFFIに適したものに変更するにはどうすればよいでしょうか?Haskell FFI:C++コレクションをどのようにラップしますか?
私は:: [CIntPointer]
のようなタイプは、可能な場合は、良い妥協であるかもしれないと思っています。
alloc、free、insert、removeなどの独自の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())
いくつかの落とし穴
:ええ、それは私がやっていることです。 – gatoatigrado
上のプログラム/ libがコンパイルするときでリンクするライブラリの場所(-L)とLIBS(-lboost *)を渡し、あなたがHaskellの側の個々の要素を変更する必要がありますか? –
@ JohnL、いいえ、単に関数を呼び出すだけです。 'do {a < - cpp_getVector(); forM a cpp_f} 'cpp_f :: ElementType - > IO()' – gatoatigrado