簡體   English   中英

模板成員函數寫入輸出迭代器

[英]Template Member Function to Write to Output Iterator

我以為我會聰明並創建接受輸出迭代器的成員函數。 這樣,我可以避免返回集合或通過引用獲取集合。 例如:

template <typename TOutIterator>
void getHeaderNames(TOutIterator destination);

template <typename TOutIterator>
void getHeaderValues(std::string const& name, TOutIterator destination);

這些函數會將結果寫入傳入的迭代器中。這樣,我不必擔心我是在寫一個集合,向量還是ostream。

現在我感覺不那么聰明。 我想將這些函數設置為虛擬,以便我可以在測試中刪除實現。 不幸的是,模板成員函數不能是虛擬的,這是有道理的。

有沒有辦法保持這些函數通用(寫入任何東西)並允許它們同時是虛擬的? 我想避免將所有內容寫入向量,只是轉向並將其寫入標准輸出或其他任何內容。

如果我需要更清楚地解釋我的情況,請告訴我。

您可以使用類型擦除來操作多態迭代器,例如Thomas Becker提出any_iterator (后來在Boost.Range中實現 )。 你最終會得到一些東西:

typedef any_iterator<
  std::string, // Value
  Writable,    // Access
  Forward,     // Traversal
> StringOutputIterator; // can represent any output iterator accepting strings

virtual void getHeaders(StringOutputIterator destination);

類型擦除的想法是為一組其他不相關的類型(由於使用模板而在C ++中經常發生)具有公共基類。 例如, std::function通過允許以類似方式操作函數指針,仿函數或lambda來將此成語應用於可調用對象。

我遇到了類似的問題,我不想將Boost添加到我的項目中......所以我決定不使用迭代器。

我最終使用std::function代替:

void getHeaderNames(std::function<void(std::string)> destination);

void getHeaderValues(std::string const& name, std::function<void(std::string)> destination);

然后,我提供了一個執行push_back的lambda,而不是std::back_inserter

std::vector<std::string> v;
getHeaderNames([&](auto name) { v.push_back(std::move(name)); });

保持它們通用的一種方法,我通常在實踐中看到這是兩個重載流輸出操作符(如果它有意義)或采取std::ostream&

當然這取決於你的確切情況:你在編寫迭代器更有意義的算法嗎? 或者只想轉儲對象的內容?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM