我想将严格ByteStrings
从 Haskell 转换为 C++ ,以通过FFIstd::string
将其传递给 C++ 库。由于可能包含字符,因此转换为 a作为中间步骤是不可行的。这里的正确方法是什么?ByteString
NULL
CString
当前解决方案
感谢您到目前为止的答案。我希望该任务有一个规范的解决方案,但也许它还不存在:)
一些c++ 库文档说明如下:
字符串 ( const char * s, size_t n );
内容被初始化为由 s 指向的字符数组中的前 n 个字符组成的字符串的副本。
因此,可以编写这样一个函数,它从 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_
看起来就像 Neil 和 Alan 指出的那样。