2010-06-24 127 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) 
     ); 

這不僅是迭代器,但你用它來創建迭代器只是使整個事情的簡單夢想,使用該實用程序的方法。