簡體   English   中英

模板容器的 C++ 模板特化

[英]c++ template specialization of template container

我會做的就像...

template < template <typename ... > typename __Container, typename ... __Args >
ostream& operator<<(ostream& os, __Container<__Args ...> const& rhs){
  stringstream ss;
  int i = 0;
  for (const auto& it : rhs) 
    ss << "idx[" << i << "] " << it << "\n";
  return os << ss.str();
}

/// 
/// ... and something template specialization code
/// 

int main (){
  std::vector<int> vec_data = { ... };
  std::cout << vec_data << std::endl; 

  std::deque<int> dq_data = { ... };
  std::cout << dq_data << std::endl; 

  std::map<std::string, double> map_data = { {}, {}, {}, ... };
  std::cout << map_data << std::endl; 


  return 0;
}

在這個例子中,deque 和 vector 不是問題,但是當我試圖專門化 std::map 時,我放棄了它。 有什么辦法可以做到嗎?

函數模板不能部分特化,但可以重載:

template <typename ...P>
std::ostream &operator<<(std::ostream &os, const std::map<P...> &map)

但這不是最好的主意,因為您還必須專注於std::multimapstd::unordered_[multi]map ,以及您將來遇到的任何非標准容器。

相反,您可以創建一個函數來打印單個元素,並為std::pair (這是地圖的元素類型)重載它。 然后從你的運營商那里打電話。

代碼還有更多問題:

  • 運算符應該只在ADL可以找到它們的地方重載。 否則,您將無法從某些地方調用它們(從定義任何operator<<的任何名稱空間;或從您的運算符上方定義的模板函數)。

    由於此處唯一合適的名稱空間是std ,並且不允許在其中添加聲明,因此您首先不應創建此類運算符。 而是編寫一個函數。

  • 包含__或以_[AZ]開頭的標識符是保留的,不要使用它們。

  • operator<<應該接受任何basic_ostream<...>以支持寬流。

  • stringstream應該是ostringstream ,或者完全刪除(直接打印到 ostream)。

暫無
暫無

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

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