Puede definir sus propias funciones C para asignar, liberar, insertar, eliminar, etc. Estas funciones pueden envolver el contenedor C++ al que desea acceder. Por ejemplo:
extern "C" {
Obj * obj_create()
{
return new Obj();
}
void obj_destroy(Obj * schema)
{
delete obj;
obj = NULL;
}
...
...
}
luego declararlos en el FFI y los envuelven cualquier manera que usted desea.
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())
también algunas precauciones:
- Asegúrese de que compila los archivos de C con un compilador de C++ (g ++ en vez de gcc). esto asegurará que las librerías stdC++ sean recogidas correctamente.
- pasar los lugares de la biblioteca (-L) y libs (-lboost *) para enlazar en al compilar el programa/lib en el lado Haskell
¿Es necesario modificar los elementos individuales en el lado Haskell? –
@JohnL, no, simplemente llame a las funciones con ellos, p. Ej. 'do {a <- cpp_getVector(); forM a cpp_f} 'donde' cpp_f :: ElementType -> IO() ' – gatoatigrado