Ich möchte eine Vorlagefunktion in C++ 11 implementieren, die ein Paar Iteratoren benötigt. Die Implementierung sollte eine spezielle Verarbeitung durchführen, wenn ein Paar von Iteratoren übergeben wird, deren Werttyp ein std::pair
beliebiger Typen ist. Ich habe versucht, mit den folgenden Definitionen zu kommen:Wie Funktion für verschiedene Iterator value_types in C++ zu überladen
// arbitrary value types
template<typename Iter>
void process(Iter begin, Iter end) {
for (Iter iter = begin; iter != end; ++iter) {
std::cout << *iter << "\n";
}
}
// std::pair value types
template<typename Iter, typename First, typename Second,
typename std::enable_if<
std::is_same<
typename std::iterator_traits<Iter>::value_type, std::pair<First,Second>
>::value
>::type* = 0>
void process(Iter begin, Iter end) {
for (Iter iter = begin; iter != end; ++iter) {
std::cout << (*iter).first << " " << (*iter).second << "\n";
}
}
Mit dem folgenden Beispielcode:
std::vector<int> int_vec{{1,2,3,4}};
process(int_vec.begin(), int_vec.end());
richtig ruft die erste Definition der Funktion process
.
std::vector<std::pair<int,std::string>> pair_vec{
{std::make_pair(1, "First"), std::make_pair(2, "Second")}};
process(pair_vec.begin(), pair_vec.end());
nennen auch die erste Definition und die Ergebnisse in der Fehlermeldung (mit Clang):
error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::__1::pair<int, std::__1::basic_string<char> >')
Warum nicht der Compiler die zweite Definition in diesem Fall abholen? Wie muss ich die überladene Funktion ändern?