<?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[Iterator Frage: Container Abstrahieren]]></title><description><![CDATA[<p>Hi, ich habe eine Interfaceklasse, die je für den Anfang und das Ende eines Containers eine Methode (begin() end()), die einene Iterator returnen soll.</p>
<p>Nun muss ich bei den STL Iteratoren aber angeben ob sie ein list&lt;...&gt;::iterator oder vector&lt;...&gt;::iterator sind.</p>
<p>Wie kann ich das Abstrahieren?</p>
<p>Ich möchte also einfach einen Iterator returnen, ich weiß nur den gespeicherten Typ (StaticVoc), aber NICHT den Container.</p>
<p>Bisher sieht's leider so aus:</p>
<pre><code>//class...
public:
	//Access
	virtual std::list&lt;StaticVoc&gt;::const_iterator getBegin()const=0;
	virtual std::list&lt;StaticVoc&gt;::const_iterator getEnd()const=0;
// /class...
</code></pre>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/162729/iterator-frage-container-abstrahieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 00:08:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162729.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Oct 2006 17:29:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 17:29:36 GMT]]></title><description><![CDATA[<p>Hi, ich habe eine Interfaceklasse, die je für den Anfang und das Ende eines Containers eine Methode (begin() end()), die einene Iterator returnen soll.</p>
<p>Nun muss ich bei den STL Iteratoren aber angeben ob sie ein list&lt;...&gt;::iterator oder vector&lt;...&gt;::iterator sind.</p>
<p>Wie kann ich das Abstrahieren?</p>
<p>Ich möchte also einfach einen Iterator returnen, ich weiß nur den gespeicherten Typ (StaticVoc), aber NICHT den Container.</p>
<p>Bisher sieht's leider so aus:</p>
<pre><code>//class...
public:
	//Access
	virtual std::list&lt;StaticVoc&gt;::const_iterator getBegin()const=0;
	virtual std::list&lt;StaticVoc&gt;::const_iterator getEnd()const=0;
// /class...
</code></pre>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159097</guid><dc:creator><![CDATA[sapiens.dyslexia]]></dc:creator><pubDate>Sun, 22 Oct 2006 17:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 17:51:32 GMT]]></title><description><![CDATA[<p>Ist der Containertyp nen template Parameter ,oder wann wird der genaue Typ des Containers festgelegt?</p>
<p>Gruß Spacelord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159117</guid><dc:creator><![CDATA[Spacelord]]></dc:creator><pubDate>Sun, 22 Oct 2006 17:51:32 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 17:58:04 GMT]]></title><description><![CDATA[<p>Ich hoffe, ich hab dich richtig verstanden. Willst du sowas?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;list&gt;
using namespace std;

template&lt;class T, template&lt;typename ElemT, typename = std::allocator&lt;ElemT&gt; &gt; class ContainerT = list &gt;
struct IteratorTraits
{
	typedef typename ContainerT&lt;T&gt;::iterator iterator;
	typedef typename ContainerT&lt;T&gt;::const_iterator const_iterator;
};

int main()
{
	vector&lt;int&gt; foo;
	IteratorTraits&lt;int, vector&gt;::iterator bar = foo.begin();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1159119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159119</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 22 Oct 2006 17:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 18:25:00 GMT]]></title><description><![CDATA[<p>Danke für euere Antworten.</p>
<p>Spacelord schrieb:</p>
<blockquote>
<p>Ist der Containertyp nen template Parameter ,oder wann wird der genaue Typ des Containers festgelegt?</p>
</blockquote>
<p>Der Containertyp soll von der das Interface implementierenden Klasse festgelegt werden, also als Implementierungsdetail gelten und folglich nicht in der Interface-Klasse erwähnt werden.</p>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Ich hoffe, ich hab dich richtig verstanden. Willst du sowas?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;list&gt;
using namespace std;

template&lt;class T, template&lt;typename ElemT, typename = std::allocator&lt;ElemT&gt; &gt; class ContainerT = list &gt;
struct IteratorTraits
{
	typedef typename ContainerT&lt;T&gt;::iterator iterator;
	typedef typename ContainerT&lt;T&gt;::const_iterator const_iterator;
};

int main()
{
	vector&lt;int&gt; foo;
	IteratorTraits&lt;int, vector&gt;::iterator bar = foo.begin();
}
</code></pre>
</blockquote>
<p>Ich schätze ich kenne mich mit Templates nicht genug aus um dir darauf zu Antworten. Also versuche ich meine Frage nochmal zusammenzufassen und dann, soweit ich das kann, Bezug auf dein Codefragment zu geben:</p>
<p>Ich möchte eine Interfaceklasse schreiben.<br />
Diese soll eine abstrakte Methode (z.B. namens .getBegin() ) besitzen, welche einen Iterator auf einen unbekannten Containertyp zurückgibt.</p>
<p>Mein Problem ist also, soweit ich das einschätze, dass die STL-Iteratoren keine gemeinsamme Parentalklasse haben. Ansonsten würde diese einfach im als Rückgabetyp angeben und dank Polymorphie könnte jeder beliebige Container in der Imlpementierungsklasse verwendet werden.</p>
<p>Deine (sehr interessante) Klasse scheint den Containertyp als Template-Argument übergeben zu bekommen, womit sie doch zur Kompilierzeit auf einen Container beschränkt wird?</p>
<p>Ich bräuchte so etwas wie Polymorphie, bin mir aber unsicher ob und wie man deine Klasse dafür verwenden kann.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159143</guid><dc:creator><![CDATA[sapiens.dyslexia]]></dc:creator><pubDate>Sun, 22 Oct 2006 18:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 18:37:56 GMT]]></title><description><![CDATA[<p>Wie wärs hiermit?</p>
<pre><code class="language-cpp">template&lt;class T, template&lt;typename ElemT, typename = std::allocator&lt;ElemT&gt; &gt; class ContainerT = vector&gt;
struct Container : public ContainerT&lt;T&gt;
{
	typedef typename ContainerT&lt;T&gt;::iterator iterator;

	iterator getBegin() const
	{
		...
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1159152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159152</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 22 Oct 2006 18:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 18:51:29 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wie wärs hiermit?</p>
<pre><code class="language-cpp">template&lt;class T, template&lt;typename ElemT, typename = std::allocator&lt;ElemT&gt; &gt; class ContainerT = vector&gt;
struct Container : public ContainerT&lt;T&gt;
{
	typedef typename ContainerT&lt;T&gt;::iterator iterator;

	iterator getBegin() const
	{
		...
	}
};
</code></pre>
</blockquote>
<p>Wie kann man Polymorphie damit verwenden?<br />
Kann ich einen Pointer auf Container verwenden und getBegin() aufrufen, ohne dabei ContainerT anzugeben?</p>
<p>Ich muss Methoden/Funktionen schreiben können, die einen Pointer auf meinen &quot;Container&quot; haben aber nichts von dem darunterliegenden Container wissen..</p>
<p>Eventuell verstehe ich deinen Code nur falsch, kannst du mir vieleicht zeigen wie man eine Funktion</p>
<pre><code class="language-cpp">void foo(/*iterator auf unbekannten Container*/);
</code></pre>
<p>schreiben kann, ohne dabei Templates für diese Funktion zu verwenden?</p>
<p>Gruß und Dank soweit!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159161</guid><dc:creator><![CDATA[sapiens.dyslexia]]></dc:creator><pubDate>Sun, 22 Oct 2006 18:51:29 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 19:00:51 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wie wärs hiermit?</p>
<pre><code class="language-cpp">template&lt;class T, template&lt;typename ElemT, typename = std::allocator&lt;ElemT&gt; &gt; class ContainerT = vector&gt;
struct Container : public ContainerT&lt;T&gt;
{
	typedef typename ContainerT&lt;T&gt;::iterator iterator;

	iterator getBegin() const
	{
		...
	}
};
</code></pre>
</blockquote>
<p>Sicher dass das funktioniert? Im übrigen ist es grundlegend kein guter Gedanke von einem STL Kontainer abzuleiten.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159168</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 22 Oct 2006 19:00:51 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 19:34:12 GMT]]></title><description><![CDATA[<p>Args, hab mich davon ablenken lassen, dass du sagtest, du bräuchtest Polymorphie. Brauchst du aber gar nicht. So was hier langt:</p>
<pre><code class="language-cpp">template&lt;class ContainerT&gt;
struct Interface
{
	virtual typename ContainerT::const_iterator getBegin() const = 0;
};

// Foo ist eine Klasse, die das Interface implementiert, in diesem Fall mit vector
struct Foo : public Interface&lt;vector&lt;StaticVoc&gt; &gt;
{
	virtual vector&lt;StaticVoc&gt;::const_iterator getBegin() const
	{
		...
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1159210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159210</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 22 Oct 2006 19:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 19:36:01 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Wie wärs hiermit?</p>
<pre><code class="language-cpp">template&lt;class T, template&lt;typename ElemT, typename = std::allocator&lt;ElemT&gt; &gt; class ContainerT = vector&gt;
struct Container : public ContainerT&lt;T&gt;
{
	typedef typename ContainerT&lt;T&gt;::iterator iterator;

	iterator getBegin() const
	{
		...
	}
};
</code></pre>
</blockquote>
<p>Sicher dass das funktioniert?</p>
</blockquote>
<p>Ja. In welchem Sinne?</p>
<blockquote>
<p>Im übrigen ist es grundlegend kein guter Gedanke von einem STL Kontainer abzuleiten.</p>
</blockquote>
<p>Kann sein, sowas vergess ich immer. Begründung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159213</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 22 Oct 2006 19:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 19:40:47 GMT]]></title><description><![CDATA[<p>Ein nicht virtueller Destruktor der STL Kontainerklassen! <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/1159219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159219</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 22 Oct 2006 19:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 20:06:39 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Ein nicht virtueller Destruktor der STL Kontainerklassen! <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>
</blockquote>
<p>Solang ich keine Membervariablen anleg, gehts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159229</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 22 Oct 2006 20:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 20:08:54 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Args, hab mich davon ablenken lassen, dass du sagtest, du bräuchtest Polymorphie. Brauchst du aber gar nicht. So was hier langt:</p>
<pre><code class="language-cpp">template&lt;class ContainerT&gt;
struct Interface
{
	virtual typename ContainerT::const_iterator getBegin() const = 0;
};

// Foo ist eine Klasse, die das Interface implementiert, in diesem Fall mit vector
struct Foo : public Interface&lt;vector&lt;StaticVoc&gt; &gt;
{
	virtual vector&lt;StaticVoc&gt;::const_iterator getBegin() const
	{
		...
	}
};
</code></pre>
</blockquote>
<p>Hmm, I don't get it. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Die Interfaceklasse soll doch gerade den den Container verstecken.<br />
Ich kann:</p>
<pre><code class="language-cpp">Interface* interface = new Foo;
</code></pre>
<p>Nicht schreiben da ich den Container als Templateargument mit angeben muss.</p>
<p>Eigentlich bräuchte ich einen Iterator, von dem alle STL Iteratoren erben um sowas:</p>
<pre><code class="language-cpp">inline void print_static_voc(StaticVoc v){std::cout &lt;&lt; v.first() &lt;&lt; std::endl;}

void ListAll(AbstractIterator it) {
	std::for_each(it.begin(),it.end(),print_static_voc());
}
</code></pre>
<p>schreiben zu können. So bräuchte (Polymorphie halt) erst zur LAUFZEIT klar sein, was für einen Container ich verwende...</p>
<p>Ich meine, die Methoden &quot;begin()&quot;, &quot;end()&quot; sind doch im Prinzip bei allen Containern gleich anwendbar und &quot;operator++&quot;, &quot;operator--&quot; und &quot;operator*&quot; auch!</p>
<p>Kann man von Containertyp nicht irgendwie OHNE explizit anzugebende Templates abstrahieren?</p>
<p>IMHO sollte das doch aufgrund des gleichen verhaltens durchaus möglich sein?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159231</guid><dc:creator><![CDATA[sapiens.dyslexia]]></dc:creator><pubDate>Sun, 22 Oct 2006 20:08:54 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 20:12:44 GMT]]></title><description><![CDATA[<p>Tschuldigung.. ich kann nicht editieren:</p>
<p>EDIT:</p>
<pre><code class="language-cpp">inline void print_static_voc(cosnt StaticVoc&amp; v){std::cout &lt;&lt; v.first() &lt;&lt; std::endl;}

void ListAll(AbstractIterator* it) {
    std::for_each(it-&gt;begin(),it-&gt;end(),print_static_voc());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1159236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159236</guid><dc:creator><![CDATA[sapiens.dyslexia]]></dc:creator><pubDate>Sun, 22 Oct 2006 20:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 20:15:51 GMT]]></title><description><![CDATA[<p>sapiens.dyslexia schrieb:</p>
<blockquote>
<p>Kann man von Containertyp nicht irgendwie OHNE explizit anzugebende Templates abstrahieren?</p>
<p>IMHO sollte das doch aufgrund des gleichen verhaltens durchaus möglich sein?</p>
</blockquote>
<p>Nein, kann mann nicht. Das ist nicht möglich. Macht auch überhaupt keinen Sinn Polymorphie und STL-Container auf diese Weise zu verwenden. Die Container haben nicht die gleiche Fähigkeiten. Nicht einmal die Iteratoren verschiedener Container haben die gleichen Fähigkeiten. Es hat schon gute Gründe, daß bei der Implementierung der STL keine Polymorphie eingesetzt wurde (abgesehen von der Effizienz). Entscheide dich für einen Containertyp und dann bleib dabei. Alles andere ist im Grunde von Anfang an zum Scheitern verurteilt (einzige Möglichkeit wäre den Iterator zu Wrappen, aber das wird so aufwändig, daß es nun gar keinen Sinn mehr macht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159240</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sun, 22 Oct 2006 20:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 22:56:33 GMT]]></title><description><![CDATA[<p>Ich wurde angewiesen (:D), das hier zu posten:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;

template&lt;class ValueType&gt;
class iterator_base {
public:
	typedef ValueType value_type;
	typedef value_type &amp;reference;
	typedef value_type *pointer;

	reference operator*() const {
		return *get();
	}
	pointer operator-&gt;() const {
		return get();
	}
	iterator_base &amp;operator++() {
		next();
		return *this;
	}
	iterator_base operator++(int) {
		iterator_base tmp(*this);
		next();
		return tmp;
	}

	bool operator==(iterator_base const &amp;o) {
		return typeid(*this) == typeid(o) &amp;&amp; equals(&amp;o);
	}

	bool operator!=(iterator_base const &amp;o) {
		return !(*this == o);
	}

	virtual iterator_base *clone() const = 0;

protected:
	virtual pointer get() const = 0;
	virtual void next() = 0;
	virtual bool equals(iterator_base const *o) const = 0;
};

template&lt;class Iterator&gt;
class concrete_iterator
: public iterator_base&lt;typename std::iterator_traits&lt;Iterator&gt;::value_type&gt; {
public:
	typedef Iterator iterator;
	typedef typename std::iterator_traits&lt;iterator&gt;::value_type value_type;
	typedef iterator_base&lt;value_type&gt; base;
	typedef typename base::pointer pointer;

	concrete_iterator(iterator const &amp;pos) : pos(pos) {}

private:
	base *clone() const {
		return new concrete_iterator(*this);
	}

	pointer get() const {
		return &amp;*pos;
	}

	void next() {
		++pos;
	}

	bool equals(base const *o) const {
		return pos == static_cast&lt;concrete_iterator const *&gt;(o)-&gt;pos;
	}

private:
	iterator pos;
};

template&lt;class T&gt;
struct iterator_proxy {
public:
	typedef T value_type;
	typedef typename iterator_base&lt;T&gt;::reference reference;
	typedef typename iterator_base&lt;T&gt;::pointer pointer;

	template&lt;class Iterator&gt;
	iterator_proxy(Iterator const &amp;it) : p(new concrete_iterator&lt;Iterator&gt;(it)) {}

	iterator_proxy(iterator_base&lt;T&gt; const &amp;it) : p(it.clone()) {}

	~iterator_proxy() {
		delete p;
	}

	iterator_proxy(iterator_proxy const &amp;o) : p(o.p-&gt;clone()) {}

	void swap(iterator_proxy &amp;o) {
		iterator_base&lt;T&gt; *tmp = p;
		p = o.p;
		o.p = tmp;
	}

	void operator=(iterator_proxy o) {
		o.swap(*this);
	}

	bool operator==(iterator_proxy const &amp;o) {
		return *p == *o.p;
	}
	bool operator!=(iterator_proxy const &amp;o) {
		return *p != *o.p;
	}

	reference operator*() const {
		return *get();
	}
	pointer operator-&gt;() const {
		return get();
	}
	iterator_proxy &amp;operator++() {
		++*p;
		return *this;
	}
	iterator_proxy operator++(int) {
		iterator_proxy tmp(*this);
		++*p;
		return tmp;
	}

private:
	pointer get() const {
		return p-&gt;operator-&gt;();
	}

	iterator_base&lt;T&gt; *p;
};

int main() {
	std::vector&lt;int&gt; v;
	v.push_back(4);
	v.push_back(5);
	v.push_back(7);
	iterator_proxy&lt;int&gt; a(v.begin());
	iterator_proxy&lt;int&gt; b(v.end());
	while (a != b) {
		std::cout &lt;&lt; *a &lt;&lt; std::endl;
		++a;
	}
}
</code></pre>
<p>Je nach Bedürfnis ließe sich das noch vereinfachen. Oder erweitern. Für alle, die eine Version mit std::auto_ptr kennen: Ja, ich habe einen Proxy gebaut.</p>
<p>Viel Spaß!</p>
<p>EDIT: #include &lt;memory&gt; wird nicht mehr gebraucht, wurde daher gelöscht.<br />
EDIT 2: Brauche kein const_reference etc. Das vereinfacht doch sehr :D.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159244</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Sun, 22 Oct 2006 22:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Sun, 22 Oct 2006 23:06:53 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>sapiens.dyslexia schrieb:</p>
<blockquote>
<p>Kann man von Containertyp nicht irgendwie OHNE explizit anzugebende Templates abstrahieren?</p>
<p>IMHO sollte das doch aufgrund des gleichen verhaltens durchaus möglich sein?</p>
</blockquote>
<p>Nein, kann mann nicht. Das ist nicht möglich. Macht auch überhaupt keinen Sinn Polymorphie und STL-Container auf diese Weise zu verwenden. Die Container haben nicht die gleiche Fähigkeiten. Nicht einmal die Iteratoren verschiedener Container haben die gleichen Fähigkeiten. Es hat schon gute Gründe, daß bei der Implementierung der STL keine Polymorphie eingesetzt wurde (abgesehen von der Effizienz). Entscheide dich für einen Containertyp und dann bleib dabei. Alles andere ist im Grunde von Anfang an zum Scheitern verurteilt (einzige Möglichkeit wäre den Iterator zu Wrappen, aber das wird so aufwändig, daß es nun gar keinen Sinn mehr macht).</p>
</blockquote>
<p>Das ist doch Unfug. Ich kann ganz locker vector durch list ersetzen und der Code klappt wie gewohnt. Eben weil das Iterator-Pattern davon abstrahiert.</p>
<p>Der Threadsteller will JAVA kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159252</guid><dc:creator><![CDATA[Apollon]]></dc:creator><pubDate>Sun, 22 Oct 2006 23:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 10:33:25 GMT]]></title><description><![CDATA[<p>Apollon schrieb:</p>
<blockquote>
<p>Z2 schrieb:</p>
<blockquote>
<p>sapiens.dyslexia schrieb:</p>
<blockquote>
<p>Kann man von Containertyp nicht irgendwie OHNE explizit anzugebende Templates abstrahieren?</p>
<p>IMHO sollte das doch aufgrund des gleichen verhaltens durchaus möglich sein?</p>
</blockquote>
<p>Nein, kann mann nicht. Das ist nicht möglich. Macht auch überhaupt keinen Sinn Polymorphie und STL-Container auf diese Weise zu verwenden. Die Container haben nicht die gleiche Fähigkeiten. Nicht einmal die Iteratoren verschiedener Container haben die gleichen Fähigkeiten. Es hat schon gute Gründe, daß bei der Implementierung der STL keine Polymorphie eingesetzt wurde (abgesehen von der Effizienz). Entscheide dich für einen Containertyp und dann bleib dabei. Alles andere ist im Grunde von Anfang an zum Scheitern verurteilt (einzige Möglichkeit wäre den Iterator zu Wrappen, aber das wird so aufwändig, daß es nun gar keinen Sinn mehr macht).</p>
</blockquote>
<p>Das ist doch Unfug. Ich kann ganz locker vector durch list ersetzen und der Code klappt wie gewohnt. Eben weil das Iterator-Pattern davon abstrahiert.</p>
</blockquote>
<p>Das ist kein Unfug. Das klappt vielleicht, wenn du dich auf eine Teilmenge der Funktionalität des vector-Interators beschränkst. Aber auch nur dann. Der vektor-Iterator kann mehr als der list-Iterator. Siehe dazu jede bessere STL-Dokumentation.</p>
<p>Apollon schrieb:</p>
<blockquote>
<p>Der Threadsteller will JAVA kopieren.</p>
</blockquote>
<p>Schwerer Fehler. Auch wenn ich damit auf das offensichtliche hinweisen muß:</p>
<p>C++ != Java</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20441">@Mr</a>. N: Ok, schön gewrappt. Aber wie übergibst du deinen Iterator nun an einen Algorithmus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159379</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Mon, 23 Oct 2006 10:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 10:18:15 GMT]]></title><description><![CDATA[<p>Die Container lassen sich nicht einfach beliebig austauschen. Z.B. kann ich std::sort() auf vector anwenden, aber bei list gehts schon mal nicht. Weil Iteratoren der jeweilgen Container nicht gleiche Features haben. Sie haben einen gewissen gemeinsammen Nenner, aber mehr auch nicht.</p>
<p>Man könnte höchstens einen Wrapper bauen, obwohl die Iteratoren das ja schon sind. Aber diese kann man natürlich nochmal verstecken, wie es Mr. N gemacht hat eine eine Möglichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159391</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 23 Oct 2006 10:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 12:47:06 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>...<br />
C++ != Java<br />
...</p>
</blockquote>
<p>Naja, wenn er unbedingt einen &quot;Laufzeit-kontrollierten Container&quot; (wie es sie in schon Java gibt) bauen möchte, kann er das ja tun - ich persönlich halte das zwar für einen unnötigen Rückschritt, aber das bedeutet ja noch nicht, dass es nicht ginge.<br />
Letztlich würde ich dann aber komplett die Java-Variante durchziehen und mit void* bzw. ContainerItemBase* und entsprechenden casts arbeiten.</p>
<p>@sapiens.dyslexia: Wieso ist Dir Laufzeitdefinition/Polymorphie so wichtig, dass es Compiletime-Definition nicht tut ?<br />
Habe ich richtig verstanden: Du willst erst zur Laufzeit entscheiden, welcher Container verwendet wird .... und zwar bei STL-Containern, die zur Compilezeit definiert werden ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159484</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 23 Oct 2006 12:47:06 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 14:43:34 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20441">@Mr</a>. N: Ok, schön gewrappt. Aber wie übergibst du deinen Iterator nun an einen Algorithmus?</p>
</blockquote>
<p>Indem ich ihn übergebe:</p>
<pre><code class="language-cpp">algorithmus_der_nur_einen_iterator_braucht(it);
</code></pre>
<p>Das nennt man Parameterübergabe. Das ist so ein ganz fieser Trick von C++, mit dem man viele böse Hacks machen kann. &lt;/sarkasmus&gt;</p>
<p>Im Ernst: Ich übergebe iterator_proxy&lt;T&gt; und das wars dann. Es gibt kein Problem.</p>
<p>Übrigens halte ich es für vollkommen irrelevant, was Java-typisch ist und was nicht. Iteratoren nicht polymorph zu machen war eine bewusste Entscheidung des Komitees (Grund war bestimmt die Geschwindigkeit) und übrigens ein Kompromiss. Und ich muss zugeben, ich habe meine heute gebauten iterator_proxys zwar noch nie verwendet, aber vielleicht wäre das an manchen Stellen gut gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159648</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Mon, 23 Oct 2006 14:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 14:48:54 GMT]]></title><description><![CDATA[<p>Wir haben halt Templates, der Algos müssen keine polymorphen Iteratoren verlangen. Hätten wir keine Templates, hätten die Algos sicherlich einen Iterator-Basistyp verlangt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159654</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 23 Oct 2006 14:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 15:11:39 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Die Container lassen sich nicht einfach beliebig austauschen.</p>
</blockquote>
<p>Du hast das Iterator-Pattern nicht verstanden. Bitte nochmal lesen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a>:<br />
Diese Anforderung ist ganz normal. Simpelstes Beispiel: Plugins. Warum sollte ich einem Plugin vorschreiben dass es seine Daten als vector speichert? Ich definiere da lieber &quot;muss forward iteratoren anbieten&quot; und fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159675</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 23 Oct 2006 15:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 15:29:52 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Artchi schrieb:</p>
<blockquote>
<p>Die Container lassen sich nicht einfach beliebig austauschen.</p>
</blockquote>
<p>Du hast das Iterator-Pattern nicht verstanden. Bitte nochmal lesen.</p>
</blockquote>
<p>Dann kannst du mir sicherlich sagen, warum std::list eine eigene sort-Methode braucht? Wie kann ich also std::sort eine list übergeben? Ich kann zwar mit einem Iterator auf einen Container rumwandern, aber ich kann nochlange nicht beliebig alles mit einem beliebigen Container machen.</p>
<p>Kann aber auch sein, das ich es wirklich nicht verstanden habe, dann wäre ne Lösung für ein einfaches Beispiel wie std::sort und std::list super. Danke! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159701</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 23 Oct 2006 15:29:52 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 15:32:03 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>...<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a>:<br />
Diese Anforderung ist ganz normal. Simpelstes Beispiel: Plugins. Warum sollte ich einem Plugin vorschreiben dass es seine Daten als vector speichert? Ich definiere da lieber &quot;muss forward iteratoren anbieten&quot; und fertig.</p>
</blockquote>
<p>Aho ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
Ich hatte das immer von der andern Seite betrachtet (sprich: Er will über seinen STL-Container einen &quot;polymorphen Stub&quot; implementieren und mir fiel kein Grund dafür ein).</p>
<p>Sowas kann man natürlich machen. Ob man sowas dann aber tatsächlich mit &quot;Standardpolymorphie&quot; und nicht mit &quot;technischeren Methoden&quot;, weiß ich nicht.</p>
<p>Aber Danke für das Beispiel.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159706</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 23 Oct 2006 15:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 15:45:11 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Dann kannst du mir sicherlich sagen, warum std::list eine eigene sort-Methode braucht?</p>
</blockquote>
<p>weil das design kacke ist?</p>
<p>list sollte std::sort spezialisieren fuer seine eigenen iteratoren. oder genereller: sort sollte fuer bidirectional iteratoren spezialisiert sein um auch so einen container sortieren zu koennen.</p>
<p>aber das tut nichts zur sache.<br />
Lies das Iterator Pattern.</p>
<blockquote>
<p>Wie kann ich also std::sort eine list übergeben? Ich kann zwar mit einem Iterator auf einen Container rumwandern, aber ich kann nochlange nicht beliebig alles mit einem beliebigen Container machen.</p>
</blockquote>
<p>Du hast das Iterator Pattern nicht verstanden.</p>
<p>Es geht nicht darum dass du alles mit allem machen kannst. Sondern dass du aequivalente Collections untereinander tauschen kannst.</p>
<p>zB wenn random access iteratoren die anforderung sind, dann braucht man einen container der das unterstuetzt. Ein stack waere zB ungeeignet hier als drop in replace zu dienen.</p>
<p>ABER:<br />
ich kann std::vector und boost::array frei tauschen. Beide erfuellen meine Anfoerderungen an die Collection.</p>
<p>Das ist das Iterator-Pattern.</p>
<p>Ich kann die Collections implementieren wie ich will. Sie muessen nur die Anforderung erfuellen.</p>
<p>Kommt dir das bekannt vor? nein? kleiner tipp:<br />
Was ist denn Vererbung? Also eine virtuelle methode:</p>
<pre><code class="language-cpp">class Base {
public:
  virtual int get_random_number() = 0;
};
</code></pre>
<p>Hier kann ich von Base erben und get_random_number implementieren wie ich will, oder?</p>
<p>falsch:</p>
<pre><code class="language-cpp">class Derived : public Base {
public:
  void get_random_number(int&amp; num);
};
</code></pre>
<p>geht ja nicht.</p>
<p>jetzt denkst du dir sicher &quot;na lol, ist doch logisch - du musst die anfoerdung erfuellen, dass ein int returned wird, die exception spezifikationen duerfen nicht lockerer sein als in base,...&quot;</p>
<p>denk darueber mal nach.</p>
<p>ist es beim auswechseln der collections nicht genauso? ich muss nur ein paar anforderungen erfuellen - aber wie ich es implementiere ist meine sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159726</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 23 Oct 2006 15:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Frage: Container Abstrahieren on Mon, 23 Oct 2006 15:47:34 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Artchi schrieb:</p>
<blockquote>
<p>Dann kannst du mir sicherlich sagen, warum std::list eine eigene sort-Methode braucht?</p>
</blockquote>
<p>weil das design kacke ist?...</p>
</blockquote>
<p>Manchmal sind die naheliegensten Antworten die besten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159732</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 23 Oct 2006 15:47:34 GMT</pubDate></item></channel></rss>