[英]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::multimap
和std::unordered_[multi]map
,以及您將來遇到的任何非標准容器。
相反,您可以創建一個函數來打印單個元素,並為std::pair
(這是地圖的元素類型)重載它。 然后從你的運營商那里打電話。
代碼還有更多問題:
運算符應該只在ADL可以找到它們的地方重載。 否則,您將無法從某些地方調用它們(從定義任何operator<<
的任何名稱空間;或從您的運算符上方定義的模板函數)。
由於此處唯一合適的名稱空間是std
,並且不允許在其中添加聲明,因此您首先不應創建此類運算符。 而是編寫一個函數。
包含__
或以_[AZ]
開頭的標識符是保留的,不要使用它們。
operator<<
應該接受任何basic_ostream<...>
以支持寬流。
stringstream
應該是ostringstream
,或者完全刪除(直接打印到 ostream)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.