我已经有了这个工作代码:
template <typename T1, typename T2>
std::ostream& operator<<(std::ostream &out, std::map<T1, T2> &map){
for (auto it = map.begin(); it != map.end(); ++it) {
out << it-> first << ", " << it->second << '\n';
}
return out;
}
template <typename T1, typename T2>
std::ostream& operator<<(std::ostream &out, std::unordered_map<T1, T2> &map){
for (auto it = map.begin(); it != map.end(); ++it) {
out << it-> first << ", " << it->second << '\n';
}
return out;
}
如您所见,这两个函数几乎相同。有没有办法删除一个并只使用一个抽象函数?
最佳答案
你确实可以:这是一个函数模板,适用于任何具有 value_type
的可迭代类型那是一个std::pair<>
.这不仅适用于 std::map<>
和 std::unordered_map<>
, 还有 std::vector<std::pair<>>
, boost::container::list<std::pair<>>
等:
namespace detail {
template<typename>
struct is_pair : std::false_type { };
template<typename T1, typename T2>
struct is_pair<std::pair<T1, T2>> : std::true_type { };
}
template<
// collection type
typename T,
// ensure value_type exists
typename VT = typename T::value_type,
// ensure value_type is some std::pair<>
typename std::enable_if<detail::is_pair<VT>{}>::type* = nullptr
>
auto operator <<(std::ostream& out, T const& coll)
// ensure begin(coll) and end(coll) are legal
-> decltype(void(begin(coll)), void(end(coll)), out) {
for (auto it = begin(coll); it != end(coll); ++it) {
out << it->first << ", " << it->second << '\n';
}
return out;
}
关于c++ - 使用一个函数打印 map 和 unordered_map 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40609412/