注意:根據回覆進行編輯以獲得更合適的答案。如何擴展std :: basic_streambuf以將任何可迭代序列視爲流?
我有多年來所做的C++模板集合,我稱之爲Joop。它主要包括不完全屬於「通用」範疇的庫,但它們足夠有用,因此我一直將它們放在不同的項目中,所以大多數庫在其他庫(例如Boost)中沒有等價物。
其中一個類是seqstream
。這個想法是,它允許你將任何可迭代的序列視爲普通的STL類流,其「字符類型」是序列的值類型。
這個班的理由是雙重的。首先,它應該提供一個界面,使任何潛在的非線性,不連續的序列看起來線性和連續;其次,它應該將流中的任何對象看作是一個單一的,複雜的大型角色。有一種將流視爲序列的標準方法,那麼爲什麼不用另一種方式呢?
目前,seqstream
爲第一個,最後一個和當前元素包裝了三個迭代器。我想用可插入標準流的basic_seqbuf
替換seqstream
。任何人都可以提供資源讓我開始延長std::basic_streambuf
提供這種行爲?
此外,如果可寫seqbuf
是允許的,這是很該對象寫入到seqbuf
確實不串行化處理的對象,但進行適當的呼叫到一個insert()
方法或使用用戶指定的插入迭代器,例如作爲std::back_insert_iterator
。
編輯:
這裏是seqstream
目前是如何使用的例子:
// Create a sequence of objects.
std::vector<std::string> sequence;
for (int i = 0; i < 10; ++i) {
std::ostringstream stream;
stream << "Element " << i << ".";
sequence.push_back(stream.str());
}
// Create a seqstream wrapping that sequence.
joop::seqstream< std::vector<std::string> > seqstream(sequence.begin(), sequence.end());
// Read the sequence like a stream.
std::string element;
while (seqstream >> element) // OR seqstream.get(element)
std::cout << element << '\n';
是否有任何理由不是從basic_streambuf繼承而來? –
MSN
2010-02-03 22:21:53
這看起來可能是要走的路。然後,我可以將該對象(比如'seqstreambuf')插入標準流中。 – 2010-02-04 02:41:26
所以,如果你寫了一個包裝器來處理一個像流的容器,那麼標準的圖書館往往會提供像constainer一樣處理流的包裝器。或者我混淆了。你能舉一個seqstream的例子嗎? – 2010-02-04 04:07:52