Angenommen, ich möchte eine universelle Funktion schreiben, die den Standardausgabebereich einer Sammlung ausgibt. Da es ich sein universal sollte davon ausgehen, dass ...Wie man den Typ des Template-Arguments bestätigt STL-Iterator Typ
std::vector<std::string> names = { "John", "Henry", "Mark" };
sowie:
std::vector<int> years = { 100, 200, 400 };
.. wird ausgedruckt möglich sein.
Da Arten von Sammlung verschieden sein können, und es gibt keine Basisklasse für STL Sammlung gibt mir Gelegenheit Basisklasse Iteratoren zu passieren verwende ich Template-Funktion:
template<typename TIterator>
void PrintRange(TIterator beginIter,TIterator endIter)
{
for(auto it = beginIter; it != endIter; ++it)
{
std::cout << *it << std::endl;
}
}
Alles ist jetzt gut funktioniert, jetzt kann ich schreiben :
PrintRange(names.begin(), names.end());
und:
PrintRange(years.begin(), years.end());
Aber jetzt er ich will lp Klient meiner Funktion, um schneller zu verstehen, warum es einen Fehler gibt, wenn er es benutzt. Nun, wenn ich rufe:
PrintRange(100, 400);
Es Fehler ist:
main.cpp:23:34: error: invalid type argument of unary ‘*’ (have ‘int’)
Ich möchte so etwas wie drucken:
One of arguments does not correspond to expected argument of type 'iterator'
Also, was Ansatz für dieses Problem ist am besten:
Es ist nicht wichtig, das zu kümmern die Fehlermeldung ist nicht so sinnvoll wie ich es erwartet hatte . Benutzer sollte Vorlagenklassencode zu Grund seines Fehlers analysieren ermitteln.
Verwenden Sie static_assert, um alle bekannten Möglichkeiten zu bestätigen .. aber wie kann man behaupten, dass das Argument der Funktion ANY Iterator ist, da es keine Basisklasse gibt?
static_assert(std::is_base_of::iterator >::value);
Dieser Vektor von String Iterator nur behaupten würde ...
Warum ist der Anfang und das Ende Iterator verschiedener Typen? Sie sollten von derselben sein – Fureeish
Wenn Sie Ihrer Funktion eine gute Dokumentation hinzufügen, muss der Benutzer keinen Ihrer Vorlagencodes überprüfen und Sie müssen keine zusätzlichen Anstrengungen unternehmen, um Eingaben zu validieren. Lassen Sie den Compiler validieren! –