我以前为<<
使用std::map
重载了template
的{{1}}
std::map<std::string, int>
例如template <typename T, typename S>
std::ostream & operator<<(std::ostream & os, const std::map<T, S>& v)
{
for (auto it : v)
os << it.first << " : " << it.second << "\n";
return os;
}
是map
时如何编写模板?
答案 0 :(得分:2)
有几种选择。
首先,您可以为operator<<
提供单独的std::vector
重载,例如e。 g。:
template <typename T>
std::ostream& operator<< (std::ostream& s, std::vector<T> const& v)
{ /* your generic implementation */ return s; }
然后地图中的每个矢量都会调用它:
os << it.first << " : " << it.second << "\n";
// ^ here...
我认为这是最干净的解决方案-但如果它太通用了,而您只需要针对此特定地图类型真正不同的东西,则可以为该地图类型专门提供单独的重载:
std::ostream& operator<<
(std::ostream& s, std::map<std::string, std::vector<int>> const& m)
{ /* your specific implementation */ return s; }
,或者为此专门让您的运营商:
template <>
std::ostream& operator<< <std::string, std::vector<int>>
(std::ostream& s, std::map<std::string, std::vector<int>> const& m)
{ /* your specific implementation */ return s; }
答案 1 :(得分:1)
有可能吗?是的,您可以编写代码。
可以吗?不,除非明确指定,否则用自己的符号扩展std
名称空间是一种未定义的行为。
看看您当前的方法,我不会重载现有方法。我会为这对夫妇提供一种新方法。