我正在尝试使用 SWIG 为使用 std::istream
读取二进制数据的 C++ API 创建 Go 包装器。我希望能够将 io.Reader
传递给这些 API,但我不确定如何在它和 std::istream
之间创建映射。我知道我需要实现一个 std::streambuf
子类,我假设其余部分将涉及 Controller 和类型映射,但我对 SWIG 不够熟悉,无法找出正确的组合。
有什么想法吗?
最佳答案
io.Reader
过于笼统,无法传递给 C 函数——它可能根本无法支持真实文件(它只是一个实现 Read(...) 函数的类)
你可以做的(只要你不在 windows 上)是使用 os.Pipe()
给你一个真正的 FH 对象,但遗憾的是 stock std::*stream 没有' 有任何方法可以从打开的文件句柄创建流。
管道钻头看起来像这样:
func wrapReader(r io.Reader) uintptr {
pr, pw, err := os.Pipe()
if err != nil {
panic(err)
}
go func () {
_, _ io.Copy(pw, r)
_ = pw.Close()
}()
return pr
}
如果您将此答案中的一些代码结合起来 How to construct a c++ fstream from a POSIX file descriptor?你可能会得到你需要的东西
关于c++ - 如何使用 SWIG 和 CGO 将 io.Reader 转换为 std::istream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32927452/