W moim projekcie, chcę podzielić strumieniowo do jakiegoś określonego rodzaju wartości, więc zaimplementować funkcję szablonu jakoDlaczego typ wartości/typ_różnicu/wskaźnik/odniesienie do argumentu typ_insert_iterator/front_insert_iterator/insert_iterator są nieważne?
template <typename TElem, typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
TElem elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
myślę, że to jest niewygodne, ponieważ muszę wyraźnie podane rodzaju TElem
podczas wywoływania go . Na przykład, muszę napisać:
std::vector<int> v;
SplitSpace<int>(std::cin, back_inserter(v));
// I want to it to be SplitSpace(std::cin, back_inserter(v));
Próbowałem uzyskać typ wartości z (szablonu) iterator i używane std::iterator_traits
następująco:
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;
}
Jednakże powyższe kody nie działają na back_insert_iterator
. Sprawdziłem kody źródłowe back_insert_iterator/front_insert_iterator/insert_iterator
w przestrzeni nazw i stwierdziłem, że value_type/difference_type/pointer/reference
są wszystkie void
.
Chciałbym wiedzieć, dlaczego te typy są wszystkie void
, czy istnieje jakiekolwiek uwzględnienie tego? Innym pytaniem jest, czy możliwe jest zaimplementowanie funkcji SplitSpace
bez jawnego nadania typowi elementu, gdy go wywołasz? Dzięki.
Są to tylko iteratory typu write, jaki inny typ powinien mieć typedef? – PlasmaHH
Nie "rodzaj". Są to OutputIteratory, tzn. Tylko do zapisu i niepowtarzalne. Nadal +1 za interesujące pytanie – sehe
Zdecydowanie dziwne, wydaje się, że nie ma żadnego powodu, aby sfałszować 'typedef' kiedy mogą być użyte zarówno do wypakowania * jak i wstawienia elementów ... –