In meinem Projekt möchte ich streamen in eine bestimmte Art von Werten teilen, so dass ich implementieren eine Template-Funktion alsWarum ist der value_type/difference_type/pointer/reference von back_insert_iterator/front_insert_iterator/insert_iterator alle ungültig?
template <typename TElem, typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
TElem elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
ich denke, das, da ich es die Art der TElem
explizit angegeben haben, wenn Sie anrufen umständlich . Zum Beispiel muss ich schreiben:
std::vector<int> v;
SplitSpace<int>(std::cin, back_inserter(v));
// I want to it to be SplitSpace(std::cin, back_inserter(v));
Ich habe versucht, den Werttyp aus einer (Schablone) Iterator und std::iterator_traits
verwendet wie folgt zu erhalten:
template <typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
typename std::iterator_traits<TOutputIter>::value_type elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
jedoch die oben genannten Codes funktionieren nicht für back_insert_iterator
. Ich überprüfte die Quellcodes von back_insert_iterator/front_insert_iterator/insert_iterator
in std
Namensraum und fand die value_type/difference_type/pointer/reference
sind alle void
.
Ich würde gerne wissen, warum diese Typen alle void
sind, gibt es eine Überlegung dafür? Eine andere Frage ist, dass es möglich ist, die SplitSpace
Funktion zu implementieren, ohne explizit den Elementtyp anzugeben, wenn es aufgerufen wird? Vielen Dank.
Sie sind Art von nur Iteratoren schreiben, welchen anderen Typ sollten diese typedefs haben? – PlasmaHH
Nicht "irgendwie". Sie sind OutputIterators, d. H. Nur schreibend und nicht wiederholbar. Noch +1 für interessante Frage – sehe
Definitiv seltsam, es scheint keinen Grund zu geben, den 'typedef' zu zerlegen, wenn sie sowohl zum Extrahieren von * als auch zum Einfügen von Elementen verwendet werden können ... –