4

我现在正在深入boost::iostreams研究,我正在寻找一种方法来创建一个迭代 some 的流container<char>

现在我有适用于 a 的代码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容器。

4

3 回答 3

3

与其将容器作为参数传递给您的函数,不如使用标准库采用的方法并使用迭代器呢?

您的函数将在迭代器类型而不是容器类型上进行模板化,并且将采用开始和结束迭代器而不是容器。然后,迭代您给它的任何容器类型的范围是一件简单的事情。

于 2010-06-24T17:05:40.263 回答
1

直接的答案是不使用迭代器。我认为我之前的人误解了这是一个 boost::iostreams 特定的问题。

我不是 boost::iostreams 方面的专家,但是您的 Load 例程已经有些通用,并且应该也可以与 std::string 一起使用(前提是您提前相应地调整它的大小以保存流缓冲区)。但是,通过使用 array_source 设备,我相信您会假设容器是可随机访问的。例如,这不适用于 std::list。为此,我不确定正确的设备是什么,但需要另一个使用迭代器的设备。

于 2010-06-24T20:10:12.737 回答
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)
         );

不仅是迭代器,而且您用来创建迭代器的实用方法只是使整个事情成为一个简单的梦想。

于 2010-06-24T20:12:49.823 回答