Haskell FFI: Как вы упаковываете коллекции C++?

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

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


person gatoatigrado    schedule 27.02.2012    source источник
comment
Вам нужно изменить отдельные элементы на стороне Haskell?   -  person John L    schedule 27.02.2012
comment
@JohnL, нет, просто вызывайте с ними функции, например do { a <- cpp_getVector(); forM a cpp_f } где cpp_f :: ElementType -> IO ()   -  person gatoatigrado    schedule 27.02.2012


Ответы (1)


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