2010-06-24 115 views
4

我现在潜入boost::iostreams,我正在寻找一种方法来创建一个流,超过一些container<char>迭代。C++输入输出流问题

现在我有一个std::vector<char>工作的代码,但它确实ONLY它,因为我写std::vector特异性代码。

我做以下的事情:

template <class Object 
void LoadImpl(Object& object, std::istream& stream) { ... } 

和用于包装序列化/使用一定的反序列化stream:其中LoadImpl(...)描述如下方式

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

能给我关于如何使Load例行更通用的任何建议吗?比方说,我希望有能力用std::vector<char>代替它,只要一些std::string容器。

+0

几个问题。您不使用容器输入参数,而是使用精简的参数“source”。他们应该是一样的吗? 你能写一些你想如何调用负载的例子吗? – 2010-06-24 17:07:16

回答

3

而不是通过容器作为参数传递给你的功能,什么关于使用标准库采取的方法,并使用迭代器?

你的功能将在迭代器类型,而不是容器类型作为模板,并会采取一个开始和结束迭代器,而非容器。然后遍历你给它的任何容器类型的范围是一件简单的事情。

+0

是的 - 当你意识到它们只应用于迭代器时,许多C++ std :: libs会更有意义。 – 2010-06-24 17:20:54

1

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

我不在的boost :: iostream的专家,但你的负载例行已经有些通用的,应该的std :: string工作,以及(只要你相应调整它提前举行流缓冲区)。但是,通过使用array_source设备,我相信你会假设容器是随机访问的。例如,这不适用于std :: list。为此,我不确定什么是正确的设备,但需要使用迭代器的另一个设备。

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

这不仅是迭代器,但你用它来创建迭代器只是使整个事情的简单梦想,使用该实用程序的方法。