我尝试使用SWIG为使用std::istream
读取二进制数据的C ++ API创建Go包装器。我希望能够将io.Reader
传递给这些API,但我不确定如何在它与std::istream
之间创建映射。我知道我需要实现一个std::streambuf
子类,我假设其余的将涉及导演和打字图,但我对SWIG不熟悉以找出合适的组合。
有什么想法吗?
答案 0 :(得分:0)
io.Reader
过于笼统,无法传递给C函数 - 它可能根本不支持真实文件(它只是一个实现Read(...)函数的类)
你能做什么(只要你不在Windows上)就是使用os.Pipe()
给你一个真实的FH对象,但遗憾的是股票std :: *流没有任何创建方法来自打开文件句柄的流。
管道位看起来像这样:
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?中的一些代码组合在一起,你可能会得到你需要的东西