Ich habe eine Funktion, wo ich einen Container, der Zeichenfolgen enthält (z. B. vector<string>
, set<string>
, list<string>
) und durchläuft bei Vorhandensein eines Start-Iterators und eines End-Iterators den Iteratorbereich und verarbeitet die Zeichenketten.
Derzeit ist die Funktion wie folgt deklariert:
template< typename ContainerIter>
void ProcessStrings(ContainerIter begin, ContainerIter end);
Jetzt wird jeder Typ akzeptiert, der der impliziten Schnittstelle der Implementierung von operator*
, Vorsilbe operator++
und alle anderen Aufrufe im Körper der Funktion.
Was ich wirklich möchte, ist eine Definition wie die folgende, die die Menge der Eingaben ausdrücklich einschränkt (Pseudocode-Warnung):
template< typename Container<string>::iterator>
void ProcessStrings(Container<string>::iterator begin, Container<string>::iterator end);
damit ich sie als solche verwenden kann:
vector<string> str_vec;
list<string> str_list;
set<SomeOtherClass> so_set;
ProcessStrings(str_vec.begin(), str_vec.end()); // OK
ProcessStrings(str_list.begin(), str_list.end()); //OK
ProcessStrings(so_set.begin(), so_set.end()); // Error
Im Wesentlichen versuche ich, die Funktionsspezifikation so einzuschränken, dass es für den Benutzer der Funktion offensichtlich ist, was sie akzeptiert, und wenn der Code nicht kompiliert werden kann, erhalten sie eine Meldung, dass sie die falschen Parametertypen verwenden, anstatt etwas im Funktionskörper, dass XXX Funktion für XXX Klasse nicht gefunden werden konnte.