Haskell FFI: Как вы оборачиваете коллекции C ++? - PullRequest
7 голосов
/ 27 февраля 2012

У меня есть функция, которая возвращает vector<MyClass>; Каков наилучший способ изменить это в нечто, соответствующее FFI?

Я думаю, что тип, подобный :: [CIntPointer], может быть хорошим компромиссом, если возможно получить.

1 Ответ

3 голосов
/ 25 апреля 2012

Вы можете определить свои собственные функции 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. Makeуверен, что вы компилируете файлы C с помощью компилятора c ++ (g ++ вместо gcc).это гарантирует, что библиотеки stdc ++ будут правильно подобраны.
  2. Передайте расположение библиотек (-L) и библиотек (-lboost *) для связи при компиляции программы / lib на стороне haskell
...