7 Stimmen

Übernehmen Sie den Parameter von stl_container_type<string>::iterator

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X