Betrachten Sie zum Beispiel einige hypothetische to_upper_iterator
, die über einen Bereich von Zeichen iteriert, std::toupper
für operator*
zurückgeben. Diese Iterator Aliase macht Sinn für mich:Was für `Iterator :: pointer` zu verwenden, wenn nichts Sinn macht?
template <typename CharT>
struct to_upper_iterator
{
using value_type = CharT;
using reference = CharT;
using difference_type = std::ptrdiff_t;
using iterator_category = std::random_access_iterator_tag;
};
Was nicht sinnvoll ist, was könnte/sollte für den pointer
Alias verwendet werden. Ich habe versucht, es wegzulassen, aber sicher genug, ich habe Kompilierungsfehler. Es scheint, dass dies auf eine Addition in C++ 17 zurückzuführen ist. von en.cppreference.com für den std::iterator_traits
Typ Zusammengefasst:
Wenn
Iterator
nicht über die fünf Elementtypendifference_type
,value_type
,pointer
,reference
unditerator_category
, dann hat diese Vorlage keine Mitglieder von jedem dieser Namen (std::iterator_traits
ist SFINAE- freundlich)
die Frage ist also: für Typen wie diese, sollte ich pointer
-etwas nur definieren - mein führende Favorit sein void
oder void*
- oder würde es mehr Sinn machen, etwas wie Spezialisierung std::iterator_traits<to_upper_iterator>
zu tun, so dass es keinen Alias für pointer
enthält.
Die Frage beschreibt keinen Ausgabe-Iterator. Ein Ausgabe-Iterator ist eine reine Senke. Was die Frage beschreibt, ist ein transformierender Iteratoradapter. – Johan
@Johan rechts. Ich habe den Extremfall gewählt, um den Punkt zu demonstrieren. Vielleicht wäre ein besseres Modell in diesem Fall 'istream_iterator <>' was den Zeiger als 'const CharT *' definiert –