是否可以将带有一对std:string和std :: vector <int>的std :: map重载<<运算符?

时间:2019-01-15 06:12:01

标签: c++ vector operator-overloading stdmap

我以前为<<使用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时如何编写模板?

2 个答案:

答案 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名称空间是一种未定义的行为。

看看您当前的方法,我不会重载现有方法。我会为这对夫妇提供一种新方法。