通过SWIG在Python中使用std :: ifstream,std :: ofstream的技术?


问题内容

有没有办法std::[io]fstream通过swig在python中使用的?

我有一个C类,其功能如下:

void readFrom(std::istream& istr);
void writeTo(std::ostream& ostr);

我想在python中构造一个std::ofstream实例,并将其作为参数传递给writeTo(并做同样的事情来读取)。

我试着做一个像

std::ostream& make_ostream(const std::string& file_name){
    return std::ofstream( file_name.c_str() );
}

在swig.i文件中,以便此功能将成为接口的一部分。但是,这不起作用。因为流类是不可复制的,所以存在一个问题。

尽管std_iostream.i似乎可以帮助使用通用[io]stream类,但对创建所需的文件流没有帮助。


问题答案:

我不知道,但是假设您需要创建一个可复制的对象,则可能会使用类似

std::shared_ptr<std::ostream> make_ostream(std::string const& filename) {
    return std::make_shared<std::ofstream>(filename);
}

…,然后使用转发功能调用您实际要调用的功能:

void writeTo(std::shared_ptr<std::ostream> stream) {
    if (stream) {
        writeTo(*stream);
    }
}

(如果名称重载会导致问题,那么您当然可以不同地调用转发功能)。