C ++ iostreams问题

时间:2010-06-24 16:53:38

标签: c++ boost-iostreams

我现在正在进入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容器。

3 个答案:

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

它不仅仅是迭代器,而是用于创建迭代器的实用程序方法,这些迭代器只是让整个事情成为一个简单的梦想。