c++ - 如何使用 SWIG 和 CGO 将 io.Reader 转换为 std::istream?

标签 c++ go swig istream cgo

我正在尝试使用 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/

相关文章:

templates - Golang 模板从字符串数组生成值错误

python - g++ 链接和 swig

c# - 如何从 C++ 为 Xamarin.Android 创建 C# DLL

c++ - C++中是否有可变长度数组?

c++ - void operator usage for calling menu

go - 在 select 语句中使用 Reader 接口(interface)时的约定

go - golang中有 "using"吗?

C++回测问题: How to check if constructor has failed when it suppose to fail (given invalid arguments inputted)

C++ - boost 线程/绑定(bind)/Shared_ptr : Assert fault

python - 在 virtualenv 内部安装 M2Crypto,而不在系统中安装 swig