gpt4 book ai didi

c++ - boost 过滤流清理

转载 作者:行者123 更新时间:2023-11-28 01:00:29 25 4
gpt4 key购买 nike

所以我有一些从文本文件中读取的代码,其中一些文件是压缩的。我认为我可以聪明地拥有一个生成 basic_istreams 的函数,而流的用户不知道或不关心数据是如何处理的。所以我写道:

basic_istream<char>* openFile(const string& filename);

...并且解析类调用该函数并且不知道幕后发生的事情。问题在于清理。当我实际做的只是打开一个 fstream 时,我可以删除该流,一切就绪。但是使用 filtering_stream 会变得更加复杂。以下是创建 filtering_stream 以读取 gzip 文件的示例代码:

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);

...但很明显,在我的例子中,我无法在堆栈上创建这些对象,因为我需要它们在函数调用后仍然存在,而且它们不可复制构造。所以我必须分配一个新的 ifstream 和一个新的 filtering_istream,而调用者只能看到 filtering_istream 而无法删除 ifstream(filtering_istream 不会为你删除。)

处理此问题的最佳方法是什么?我可以想到很多笨拙的解决方案——返回一个 basic_istream* 和一个要销毁的 basic_istream* 列表;返回一个本质上类似于 cleanup() 闭包的对象;等等——但我想不出有什么让我真正满意的。提前感谢您提供的任何指导。

最佳答案

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

例如:

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));
}
}

关于c++ - boost 过滤流清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com