Я хочу преобразовать строгий ByteStrings
из Haskell в std::string
C++, чтобы передать его в библиотеку C++ через FFI. Поскольку ByteString
может содержать NULL
символов, преобразование в CString
в качестве промежуточного шага нецелесообразно. Какой здесь правильный подход?
текущее решение
Спасибо за ответы. Я надеялся на каноническое решение этой задачи, но, возможно, его еще не существует :)
В некоторой документации по библиотеке C++ говорится следующее:
строка (const char * s, size_t n);
Содержимое инициализируется копией строки, состоящей из первых n символов в массиве символов, на который указывает s.
Поэтому можно написать такую функцию, которая один раз копирует из ByteString для построения std::string
foreign import ccall unsafe toCCString_ :: CString -> CUInt -> IO (Ptr CCString)
toCCString :: ByteString -> IO (Ptr CCString)
toCCString bs =
unsafeUseAsCStringLen bs $ \(cstring,len) ->
toCCString_ cstring (fromIntegral len)
Тогда код C++, сопровождающий toCCString_
, будет выглядеть так, как указали Нил и Алан.
CString
. Не знал тогда, что это что-то конкретное. Вернулись. - person Lightness Races in Orbit   schedule 26.05.2011