<?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[std::vector&amp;lt;&amp;gt;::iterator casten ?!]]></title><description><![CDATA[<p>Hallo,<br />
folgende Klassen sind vorhanden:</p>
<pre><code class="language-cpp">class Interface
{
public:
  virtual void run( ) = 0; 
}

class Base
: public Interface
{
public:
  void run( ); 
  void setup( ... );
  void calc( ... );
}

class Handler
{
public:
  std::vector&lt; Base* &gt;::iterator getIterator( ) const;

private:
  std::vector&lt; Base* &gt; m_vector;
}
</code></pre>
<p>Über die getIterator( ) Methode kann der User nun über die Base* Instanzen iterieren und was sinnvolles damit machen. Da ich dem User aber eigentlich nur das Interface anbieten möchte würde ich mir folgende Klasse vorstellen:</p>
<pre><code class="language-cpp">class Handler
{
public:
  std::vector&lt; Interface* &gt;::iterator getIterator( ) const;

private:
  std::vector&lt; Base* &gt; m_vector;
}
</code></pre>
<p>Da beide Vectoren unterschiedliche Template Typen verwenden passt das natürlich so nicht zusammen...</p>
<p>Deshalb meine Frage:<br />
Wie würdet ihr dieses Problem lösen ? Ich steh gerade auf dem Schlauch <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/topic/266759/std-vector-lt-gt-iterator-casten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 19:55:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266759.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 May 2010 22:05:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::vector&amp;lt;&amp;gt;::iterator casten ?! on Thu, 13 May 2010 22:05:49 GMT]]></title><description><![CDATA[<p>Hallo,<br />
folgende Klassen sind vorhanden:</p>
<pre><code class="language-cpp">class Interface
{
public:
  virtual void run( ) = 0; 
}

class Base
: public Interface
{
public:
  void run( ); 
  void setup( ... );
  void calc( ... );
}

class Handler
{
public:
  std::vector&lt; Base* &gt;::iterator getIterator( ) const;

private:
  std::vector&lt; Base* &gt; m_vector;
}
</code></pre>
<p>Über die getIterator( ) Methode kann der User nun über die Base* Instanzen iterieren und was sinnvolles damit machen. Da ich dem User aber eigentlich nur das Interface anbieten möchte würde ich mir folgende Klasse vorstellen:</p>
<pre><code class="language-cpp">class Handler
{
public:
  std::vector&lt; Interface* &gt;::iterator getIterator( ) const;

private:
  std::vector&lt; Base* &gt; m_vector;
}
</code></pre>
<p>Da beide Vectoren unterschiedliche Template Typen verwenden passt das natürlich so nicht zusammen...</p>
<p>Deshalb meine Frage:<br />
Wie würdet ihr dieses Problem lösen ? Ich steh gerade auf dem Schlauch <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/1896875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896875</guid><dc:creator><![CDATA[void_0815]]></dc:creator><pubDate>Thu, 13 May 2010 22:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;&amp;gt;::iterator casten ?! on Thu, 13 May 2010 22:15:48 GMT]]></title><description><![CDATA[<p>Einfach m_vector in einen std::vector&lt;Interface*&gt; ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896880</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 13 May 2010 22:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;&amp;gt;::iterator casten ?! on Thu, 13 May 2010 22:19:46 GMT]]></title><description><![CDATA[<p>Du hast Glück, eine ähnliche Frage gabs <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-245401-and-highlight-is-castiterator.html" rel="nofollow">schon mal</a>. Ich habe dort einen Vorschlag für eine <code>cast_iterator</code> -Klasse gebracht, vielleicht nützt diese dir etwas.</p>
<p>Wobei Athars Vorschlag natürlich besser ist, sollte das möglich sein (falls dein Codebeispiel keine relevanten Details weglässt, trifft dies zu).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896881</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 13 May 2010 22:19:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;&amp;gt;::iterator casten ?! on Fri, 14 May 2010 08:14:53 GMT]]></title><description><![CDATA[<p>Stimmt ich habe im Handler ein Detail vergessen:</p>
<pre><code class="language-cpp">class Handler
{
public:
  std::vector&lt; Base* &gt;::iterator getIterator( ) const;

  void calc( )
  {
    std::for_each( m_vector.begin( ), m_vector.end( ). functorToCallCalc );
  }

private:
  std::vector&lt; Base* &gt; m_vector;
}
</code></pre>
<p>Somit ist es leider nicht moeglich im Vector direkt Interface Zeiger zu speicher. Ich habe nun den Vorschlag von Nexus aufgegriffen und einen eigenen Iterator implementiert:</p>
<pre><code class="language-cpp">template &lt;class Vector, class ValueType = Vector::value_type&gt; class TIteratorVector
	{
	public:
		TIteratorVector( typename Vector::iterator&amp; beginIterator, typename Vector::iterator&amp; endIterator );

		// Iterator auf den Anfang setzen.
		void begin( );

		// Iterator auf das Ende setzen.
		void end( );

		// Iterator inkrementieren.
		void operator++( );

		// Iterator dekrementieren.
		void operator--( );

		// Pruefen ob der Anfang erreicht wurde.
		bool getBeginReached( ) const;

		// Pruefen ob das Ende erreicht wurde.
		bool getEndReached( ) const;

		// Das aktuelle Element zurueckgeben.
		typename ValueType getElement( );

	private:
		// Begin Iterator.
		typename Vector::iterator m_beginIterator;

		// End Iterator.
		typename Vector::iterator m_endIterator;

		// Aktueller iterator.
		typename Vector::iterator m_currentIterator;
	};
</code></pre>
<p>In der getElement( ) Methode kann ich mir auch den Cast sparen:</p>
<pre><code class="language-cpp">template &lt;class Vector, class ValueType&gt; typename ValueType TConstIteratorVector&lt;Vector, ValueType&gt;::getElement( )
{
	// Das Element zurueckgeben.
	return *m_currentConstIterator;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1896926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896926</guid><dc:creator><![CDATA[void_0815]]></dc:creator><pubDate>Fri, 14 May 2010 08:14:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;&amp;gt;::iterator casten ?! on Fri, 14 May 2010 15:48:24 GMT]]></title><description><![CDATA[<p>void_0815 schrieb:</p>
<blockquote>
<p>Ich habe nun den Vorschlag von Nexus aufgegriffen und einen eigenen Iterator implementiert:</p>
<pre><code class="language-cpp">template &lt;class Vector, class ValueType = Vector::value_type&gt; class TIteratorVector
	{
	public:
		TIteratorVector( typename Vector::iterator&amp; beginIterator, typename Vector::iterator&amp; endIterator );

		// Iterator auf den Anfang setzen.
		void begin( );

		// Iterator auf das Ende setzen.
		void end( );

		// Iterator inkrementieren.
		void operator++( );

		// Iterator dekrementieren.
		void operator--( );

		// Pruefen ob der Anfang erreicht wurde.
		bool getBeginReached( ) const;

		// Pruefen ob das Ende erreicht wurde.
		bool getEndReached( ) const;

		// Das aktuelle Element zurueckgeben.
		typename ValueType getElement( );

	private:
		// Begin Iterator.
		typename Vector::iterator m_beginIterator;
		
		// End Iterator.
		typename Vector::iterator m_endIterator;

		// Aktueller iterator.
		typename Vector::iterator m_currentIterator;
	};
</code></pre>
</blockquote>
<p>Abgesehen von den Operatoren ++ und -- hat deine Klasse nichts mehr mit einem Iterator gemeinsam (aber selbst diese haben wegen <code>void</code> als Rückgabetyp eine ungewöhnliche Semantik). Ein Iterator ist eine Abstraktion eines Zeigers und weiss nichts über die Sequenz, also auch nichts über deren Beginn und Ende. Du packst zu viel Funktionalität in eine Klasse und schränkst dich damit zu stark ein. Die STL trennt Container, Algorithmen und Iteratoren absichtlich, um die Generizität und Modularität zu erhöhen. Ich rate dir dasselbe, wobei du nur einen Iterator implementieren musst. Orientiere dich doch an meinem verlinkten Beispiel.</p>
<p>Die Methoden <code>begin()</code> , <code>end()</code> , <code>getBeginReached()</code> , <code>getEndReached()</code> und <code>getElement()</code> würde ich weglassen, dafür <code>operator*</code> , <code>operator-&gt;</code> , <code>operator++(int)</code> , <code>operator--(int)</code> , <code>operator==</code> und <code>operator!=</code> anbieten, also eine intuitive Iterator-Schnittstelle, wie man sie von der STL kennt.</p>
<p>Übrigens ist <code>Base</code> ein ziemlich schlecht gewählter Name für die abgeleitete Klasse. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897146</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 14 May 2010 15:48:24 GMT</pubDate></item></channel></rss>