<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Standard-Insert-Iteratoren mit sinnlosen Typedefs]]></title><description><![CDATA[<p>Definition des Klassentemplates <code>std::back_insert_iterator</code> :</p>
<pre><code class="language-cpp">template &lt;class Container&gt;
class back_insert_iterator :
    public iterator&lt;output_iterator_tag,void,void,void,void,void&gt;
{
    // ...
}
</code></pre>
<p>Weiss jemand, warum dort überall <code>void</code> steht und die ganze Typinformation über Bord geworfen wird? Warum hätte man nicht die Typdefinitionen des unterliegenden Containers nehmen können?</p>
<p>Das zwingt mich nämlich zu unnötigen Spezialisierungen, wenn ich den Typ hinter einem Iterator herausfinden will:</p>
<pre><code class="language-cpp">template &lt;typename Iterator&gt;
struct IteratorValueType
{
	typedef typename std::iterator_traits&lt;Iterator&gt;::value_type Type;
};

template &lt;class Container&gt;
struct IteratorValueType&lt; std::front_insert_iterator&lt;Container&gt; &gt;
{
	typedef typename Container::value_type Type;
};

template &lt;class Container&gt;
struct IteratorValueType&lt; std::back_insert_iterator&lt;Container&gt; &gt;
{
	typedef typename Container::value_type Type;
};

template &lt;class Container&gt;
struct IteratorValueType&lt; std::insert_iterator&lt;Container&gt; &gt;
{
	typedef typename Container::value_type Type;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/275238/standard-insert-iteratoren-mit-sinnlosen-typedefs</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 01:57:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275238.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Oct 2010 19:16:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Mon, 11 Oct 2010 19:16:07 GMT]]></title><description><![CDATA[<p>Definition des Klassentemplates <code>std::back_insert_iterator</code> :</p>
<pre><code class="language-cpp">template &lt;class Container&gt;
class back_insert_iterator :
    public iterator&lt;output_iterator_tag,void,void,void,void,void&gt;
{
    // ...
}
</code></pre>
<p>Weiss jemand, warum dort überall <code>void</code> steht und die ganze Typinformation über Bord geworfen wird? Warum hätte man nicht die Typdefinitionen des unterliegenden Containers nehmen können?</p>
<p>Das zwingt mich nämlich zu unnötigen Spezialisierungen, wenn ich den Typ hinter einem Iterator herausfinden will:</p>
<pre><code class="language-cpp">template &lt;typename Iterator&gt;
struct IteratorValueType
{
	typedef typename std::iterator_traits&lt;Iterator&gt;::value_type Type;
};

template &lt;class Container&gt;
struct IteratorValueType&lt; std::front_insert_iterator&lt;Container&gt; &gt;
{
	typedef typename Container::value_type Type;
};

template &lt;class Container&gt;
struct IteratorValueType&lt; std::back_insert_iterator&lt;Container&gt; &gt;
{
	typedef typename Container::value_type Type;
};

template &lt;class Container&gt;
struct IteratorValueType&lt; std::insert_iterator&lt;Container&gt; &gt;
{
	typedef typename Container::value_type Type;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1964059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964059</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 11 Oct 2010 19:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Mon, 11 Oct 2010 20:20:42 GMT]]></title><description><![CDATA[<p><a href="http://stackoverflow.com/questions/2619551/output-iterators-value-type" rel="nofollow">http://stackoverflow.com/questions/2619551/output-iterators-value-type</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1964084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964084</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 11 Oct 2010 20:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Mon, 11 Oct 2010 22:16:12 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort. Ich hätte eher vermutet, der Grund würde in die Richtung gehen &quot;Container brauchen so kein <code>value_type</code> als Typedef → weniger Anforderungen&quot;. So wie ich den Thread auf Stackoverflow verstehe, ist die Argumentation folgendermassen:</p>
<p>Da <code>value_type</code> den Werttyp des dereferenzierten Iterators <code>*itr</code> zurückgibt und Output-Iteratoren nicht zwingend eine sinnvolle Dereferenzierung besitzen, soll <code>value_type</code> bei Output-Iteratoren immer <code>void</code> sein.</p>
<p>Aber wäre es nicht sinnvoller gewesen, <code>value_type</code> im Falle von Output-Iteratoren etwas weiter zu fassen und damit den Typ zu bezeichnen, in den geschrieben wird? Mir ist bewusst, dass es sich dabei nicht um eine Sequenz handeln muss, ausgegebene Elemente können schliesslich ohne Speicherung unmittelbar verarbeitet werden. Trotzdem muss zu dieser Verarbeitung der Typ des Elements bekannt sein.</p>
<p>Diesen Elementtypen kann man momentan leider nicht ohne Weiteres bestimmen, wenn ein beliebiger Output-Iterator vorliegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1964110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964110</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 11 Oct 2010 22:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Tue, 12 Oct 2010 02:21:07 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Trotzdem muss zu dieser Verarbeitung der Typ des Elements bekannt sein.</p>
<p>Diesen Elementtypen kann man momentan leider nicht ohne Weiteres bestimmen, wenn ein beliebiger Output-Iterator vorliegt.</p>
</blockquote>
<p>Weil - so wie ich das verstehe - ein Output-Iterator keinen Element-Typ haben muss.</p>
<p>Man könnte z.B. vom &quot; <code>operator *</code> &quot; einen Proxy zurückgeben, der einen Template-Zuweisungsoperator hat.<br />
z.B. um in Streams zu schreiben oder was auch immer.</p>
<p>Vermutlich hätte man es auch so regeln können, dass <code>value_type</code> für Output-Iteratoren die genau einen fixen Typ &quot;haben&quot; genau als dieser Typ definiert sein muss, und nur für Output-Iteratoren auf die das nicht zutrifft <code>void</code> .<br />
Evtl. hätte man die entsprechenden Typedefs auch einfach weglassen können, und das Iterator-Konzept soweit abändern, dass eben nicht jeder (Output-)Iterator ein <code>value_type</code> Typedef haben muss.</p>
<p>Warum das nicht so gemacht wurde weiss ich auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1964135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964135</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 12 Oct 2010 02:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Wed, 13 Oct 2010 17:38:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Weil - so wie ich das verstehe - ein Output-Iterator keinen Element-Typ haben muss.</p>
<p>Man könnte z.B. vom &quot; <code>operator *</code> &quot; einen Proxy zurückgeben, der einen Template-Zuweisungsoperator hat.<br />
z.B. um in Streams zu schreiben oder was auch immer.</p>
</blockquote>
<p>Du gehst hier aber davon aus, dass der &quot;Element-Typ&quot;, falls man einen definieren könnte, gleich dem Typ des dereferenzierten Iterators sein müsste. Ich frage mich eher, warum der <code>value_type</code> nicht von Anfang an allgemeiner aufgefasst wurde. Man hätte sich vielleicht nicht so stark an Input-Iteratoren orientieren sollen.</p>
<p>Denn meistens werden Output-Iteratoren so verwendet:</p>
<pre><code class="language-cpp">*itr++ = value;
</code></pre>
<p>Meiner Meinung nach wäre es folglich am sinnvollsten, wenn <code>value_type</code> dem Parametertyp von</p>
<pre><code class="language-cpp">decltype(*itr)::operator=
</code></pre>
<p>entspräche (allfällige Referenzen und <code>const</code> entfernt). Denn diese Beziehung kann auf Proxies ebenso angewendet werden wie auf herkömmliche Container-Iteratoren – schliesslich muss der Operand des Zuweisungsoperators (im Beispiel <code>value</code> ) zu jenem Typ kompatibel sein, wenn er durch den Iterator ausgegeben wird. Jedoch sehe ich Probleme in Verbindung mit mehreren <code>operator=</code> -Überladungen.</p>
<p>Die momentane Regel, <code>value_type</code> solle bei Output-Iteratoren <code>void</code> sein, ist nicht nur hinderlich, sondern auch inkonsistent. Spätestens wenn es sich um einen kombinierten Iterator (z.B. Forward-Iterator) handelt, muss <code>value_type</code> wegen der Input-Iteratoren einen sinnvollen Typ besitzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965160</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Oct 2010 17:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Wed, 13 Oct 2010 18:49:04 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Denn meistens werden Output-Iteratoren so verwendet:</p>
<pre><code class="language-cpp">*itr++ = value;
</code></pre>
<p>Meiner Meinung nach wäre es folglich am sinnvollsten, wenn <code>value_type</code> dem Parametertyp von</p>
<pre><code class="language-cpp">decltype(*itr)::operator=
</code></pre>
<p>entspräche (allfällige Referenzen und <code>const</code> entfernt). Denn diese Beziehung kann auf Proxies ebenso angewendet werden wie auf herkömmliche Container-Iteratoren – schliesslich muss der Operand des Zuweisungsoperators (im Beispiel <code>value</code> ) zu jenem Typ kompatibel sein, wenn er durch den Iterator ausgegeben wird. Jedoch sehe ich Probleme in Verbindung mit mehreren <code>operator=</code> -Überladungen.</p>
</blockquote>
<p>Ich hab' ja geschrieben <em>&quot;einen Proxy zurückgeben, der einen Template-Zuweisungsoperator hat&quot;</em>.<br />
Ob jetzt überladungen oder nen Template-Zuweisungsoperator ist egal, kommt aufs selbe raus.</p>
<blockquote>
<p>Die momentane Regel, value_type solle bei Output-Iteratoren void sein, ist nicht nur hinderlich, sondern auch inkonsistent. Spätestens wenn es sich um einen kombinierten Iterator (z.B. Forward-Iterator) handelt, muss value_type wegen der Input-Iteratoren einen sinnvollen Typ besitzen.</p>
</blockquote>
<p>Ist denn vorgeschrieben dass value_type für Output-Iteratoren immer void sein muss? Wenn ja, dann ist ein Forward-Iterator eben kein Output-Iterator. Das wäre natürlich etwas seltsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965196</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 13 Oct 2010 18:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Standard-Insert-Iteratoren mit sinnlosen Typedefs on Wed, 13 Oct 2010 20:36:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich hab' ja geschrieben <em>&quot;einen Proxy zurückgeben, der einen Template-Zuweisungsoperator hat&quot;</em>.<br />
Ob jetzt überladungen oder nen Template-Zuweisungsoperator ist egal, kommt aufs selbe raus.</p>
</blockquote>
<p>Ah sorry, von der Seite hab ich das gar nicht gesehen (die Problematik ist mir erst im Nachhinein eingefallen, daher der Edit). Du hast natürlich Recht, der Typ wäre auch hier nicht eindeutig.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ist denn vorgeschrieben dass value_type für Output-Iteratoren immer void sein muss? Wenn ja, dann ist ein Forward-Iterator eben kein Output-Iterator. Das wäre natürlich etwas seltsam.</p>
</blockquote>
<p>Ja, so habe ich das verstanden, deshalb meine Skepsis. Hier die Stelle im Standard:</p>
<p>§24.3.1/1 Iterator traits schrieb:</p>
<blockquote>
<p>To implement algorithms only in terms of iterators, it is often necessary to determine the value and difference types that correspond to a particular iterator type. Accordingly, it is required that if Iterator is the type of an iterator, the types</p>
<pre><code class="language-cpp">iterator_traits&lt;Iterator&gt;::difference_type
iterator_traits&lt;Iterator&gt;::value_type
iterator_traits&lt;Iterator&gt;::iterator_category
</code></pre>
<p>be defined as the iterator’s difference type, value type and iterator category, respectively. <strong>In the case of an output iterator, the types</strong></p>
<pre><code class="language-cpp">iterator_traits&lt;Iterator&gt;::difference_type
iterator_traits&lt;Iterator&gt;::value_type
</code></pre>
<p><strong>are both defined as void.</strong></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1965248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965248</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Oct 2010 20:36:04 GMT</pubDate></item></channel></rss>