我现在正在进入boost::iostreams
,我正在寻找一种方法来创建一个迭代某些container<char>
的流。
现在我的代码适用于std::vector<char>
,但它仅,,因为我写了std::vector
- 特定代码。
我正在做以下事情:
template <class Object, class Container>
void Load(Object& object, const Container& container) {
using namespace boost::iostreams;
// Create a stream that iterates over vector and use it in
// the following procedure
LoadImpl(object, stream<array_source>(&container[0], container.size()));
}
其中LoadImpl(...)
的描述如下:
template <class Object
void LoadImpl(Object& object, std::istream& stream) { ... }
用于使用某些stream
包装序列化/反序列化。
您能否就如何使Load
例程变得更通用给我任何建议?让我们说,我希望能够将std::vector<char>
替换为std::string
容器。
答案 0 :(得分:3)
不是将容器作为参数传递给函数,而是使用标准库采用的方法,并使用迭代器呢?
您的函数将在迭代器类型而不是容器类型上进行模板化,并且将使用开始和结束迭代器而不是容器。然后,迭代你给它的任何容器类型的范围是一件简单的事情。
答案 1 :(得分:1)
直接的答案是不使用迭代器。我认为我之前的人误解了这是一个特殊的提升:: iostreams问题。
我不是boost :: iostreams的专家,但是你的Load例程已经有些通用,并且也应该与std :: string一起使用(前提是你事先相应地调整它来保存流缓冲区)。但是,通过使用array_source设备,我相信你会假设容器是随机可访问的。例如,这不适用于std :: list。为此,我不确定正确的设备是什么,但需要另一个使用迭代器的设备。
答案 2 :(得分:1)
我建议您查看标准库提供的设施 它有一整套迭代器适配器,可以帮助您操作容器。
// Copy a stream into a vector
std::vector<char> vec; // This could be any container the
// code below would still work.
std::copy(std::istreambuf_iterator<char>(std::cin),
std::istreambuf_iterator<char>(),
std::back_inserter(vec)
);
它不仅仅是迭代器,而是用于创建迭代器的实用程序方法,这些迭代器只是让整个事情成为一个简单的梦想。