对老师的输出函数进行修改:如下
template<typename T, typename Cont>
auto output_element(std::ostream &os, const T &element,
const Cont &)
-> typename std::enable_if<is_pair<typename Cont::value_type>::value, bool>::type {
os << element.first << " => " << element.second;
return true;
}
template<typename T, typename Cont>
auto output_element(std::ostream &os, const T &element,
const Cont &)
-> typename std::enable_if<!is_pair<typename Cont::value_type>::value, bool>::type {
os << element;
return false;
}
调用处:
output_element(os, elem, container);
这个方法学习自老师之前讲过的SFINAE!
另外,针对老师的代码有些疑问:
老师代码调用处:
output_element(os, *it, container, is_pair<element_type>());
实际上在这里就确定了element_type是不是pair,也就是这里传递进去直接就是true_type或者false_type,针对,map/vector/set等直接就可以区分开来,不需要写:std::declval<typename Cont::key_type>()。
也是可以正常完成输出的,但是当传递的是true_type且容器没有key_type的时候就是SFINAE问题,调用另一个重载函数。
问题是,一个容器元素是pair,那么is_pair<element_type>()就是true_type,而既然是pair了,也就有了key_type,所以这个必然成立,也就是写与不写都可以。另外,当不是pair,就是false_type,肯定调false_type的output_element重载咯,所以我得出这里写这个std::declval<typename Cont::key_type>()没有啥子用,并且代码测试过确实可以不写,望老师指点!
展开
作者回复: 我并不希望把vector<pair<…>> 输出成“=>”的形式。我要仅在输出map、unordered_map的元素时才使用“=>”。