如何使用SWIG&将io.Reader转换为std :: istream? CGO?

时间:2015-10-03 21:00:46

标签: c++ go swig istream cgo

我尝试使用SWIG为使用std::istream读取二进制数据的C ++ API创建Go包装器。我希望能够将io.Reader传递给这些API,但我不确定如何在它与std::istream之间创建映射。我知道我需要实现一个std::streambuf子类,我假设其余的将涉及导演和打字图,但我对SWIG不熟悉以找出合适的组合。

有什么想法吗?

1 个答案:

答案 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?中的一些代码组合在一起,你可能会得到你需要的东西