首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强filtering_stream清理

增强filtering_stream清理
EN

Stack Overflow用户
提问于 2012-01-26 23:43:50
回答 2查看 825关注 0票数 0

所以我有一些读取文本文件的代码,其中一些文件是gzipped格式的。我认为我可以聪明地使用一个函数来生成basic_istreams,而流的用户既不知道也不关心数据是如何处理的。所以我写道:

代码语言:javascript
复制
basic_istream<char>* openFile(const string& filename);

解析类...and调用该函数,并且不知道幕后发生了什么。问题出在清理上。当我实际正在做的只是打开一个fstream时,我只需要删除流,我就完成了所有的设置。但是有了filtering_stream,事情就变得更复杂了。下面是创建filtering_stream以读取gzipped文件的示例代码:

代码语言:javascript
复制
std::ifstream file (filename, std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_istream in;
in.push (boost::iostreams::gzip_decompressor());
in.push (file);

...but显然,在我的例子中,我不能在堆栈上创建这些对象,因为我需要它们比函数调用更持久,而且它们不是可复制构造的。因此,我必须分配一个新的ifstream和一个新的filtering_istream,而调用者只能看到filtering_istream,并且无法删除ifstream ( filtering_istream不会为您删除它)。

处理这个问题的最好方法是什么?我可以想到很多笨拙的解决方案--既返回一个basic_istream*,又返回一个要销毁的basic_istream*列表;返回一个本质上像cleanup()闭包的对象;等等--但我想不出任何我真正满意的解决方案。提前感谢您能提供的任何指导。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-27 00:20:55

如果返回一个shared_ptr (std或boost)而不是原始指针呢?然后,您可以将deleter设置为知道如何删除所有相应组件的函数对象。

例如:

代码语言:javascript
复制
basic_istream<char>* openFile(const string& filename)
{
    if(normal_file)
    {
        return boost::shared_ptr<basic_istream<char> >(however_you_create_stream);
    }
    else
    {
        // GZIPed file.
        return boost::shared_ptr<basic_istream<char> >(filtering_stream, CleanupStreams(filtering_stream_ptr, raw_stream_ptr));
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-01-27 00:15:48

也许你可以子类化boost::iostreams::filtering_istream并添加一些类似push_cleanup成员函数的东西,它会获取一个指向istream的指针,记住它并在销毁时删除它(当然还会调用基类的push() )。然后使用并返回该子类的an实例,而不是boost::iostreams::filtering_istream

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9020753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档