Я пытаюсь использовать SWIG для создания оболочки Go для API C ++, который использует std::istream
читать двоичные данные. Я хотел бы быть в состоянии передать io.Reader
к этим API, но я не уверен, как создать отображение между ним и std::istream
, Я знаю, что мне нужно реализовать std::streambuf
Я полагаю, что в подклассе все остальное будет связано с режиссерами и типографскими картами, но я недостаточно знаком с SWIG, чтобы определить правильную комбинацию.
Есть идеи?
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
}
Если вы объедините что-то из кода в этом ответе Как создать f ++ cstream из файлового дескриптора POSIX? вы можете получить то, что вам нужно
Других решений пока нет …