<?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[Templates und verschachteltes STL-Objekt]]></title><description><![CDATA[<p>Hab mich gerade mit templates etwas beschäftigt und bin auf ein Problem gestoßen, bei dem ich mich schwer tue <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;list&gt;
#include &lt;vector&gt;

template&lt;typename T, typename U&gt;
class TableStyle
{
	private:

	public:
		void print(const T &amp;head, const U &amp;data);
};

template&lt;typename T, typename U&gt;
void TableStyle&lt;T, U&gt;::print(const T &amp;head, const U &amp;data)
{
	typename T::const_iterator iterHead;
	typename U::const_iterator iterData;

	for(iterHead=head.begin(); iterHead!=head.end(); ++iterHead)
		std::cout &lt;&lt; iterHead-&gt;length() &lt;&lt; std::endl;

	// erst ueber std::vector
	for(iterData=data.begin(); iterData!=data.end(); ++iterData)
	{
		// dann noch ueber std::list 
		/*
			An dieser Stelle moechte ich ueber das &quot;innere&quot; Objekt iterieren.
		*/
	}
}

int main()
{
	TableStyle&lt;std::list&lt;std::string&gt;, std::vector&lt;std::list&lt;std::string&gt; &gt; &gt; oTs;

	std::list&lt;std::string&gt; head;
	std::vector&lt;std::list&lt;std::string&gt; &gt; data;

	oTs.print(head, data);
}
</code></pre>
<p>Wie alle sehen, hab ich als 2. Parameter ein verschachteltes Konstrukt (Instanziierung).</p>
<p>Frage 1:<br />
- das std::string soll immer gleich bleiben und nicht durch andere Container ersetzt werden.</p>
<p>Frage 2.<br />
- die Iteration ueber std::list bei data in der Funktion print ist mir ein Rätsel.</p>
<p>Ansätze zu 1. kann ich grad net liefern. Meine Idee wäre, das alles aufzudröseln und mehrere Templateparameter zu übergeben, wobei ich den einen mit std::string fest zuweise, geht natürlich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<pre><code class="language-cpp">template&lt;typename T, typename U, typename V=std::string&gt;

//[...]

template&lt;typename T, typename U, typename V&gt;
void TableStyle&lt;T, U, V&gt;::print(const T &amp;head, const U&lt;V&gt; &amp;data)
</code></pre>
<p>zu 2. viel mir ein, ein temporäres Objekt zu erstellen, und darüber dann zu iterieren ... so:</p>
<pre><code class="language-cpp">std::list&lt;std::string&gt; temp = *iterData;
</code></pre>
<p>Wobei der vordere Teil natürlich wiederum über Templateparameter gesteuert wird.<br />
Das funktioniert zwar, aber geht das auch anders?</p>
<p>Wäre abgefahren, wenn jemand Tipps hat. (Bitte net nach dem Sinn fragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> und ja ... ich habs kompliziert beschrieben)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277320/templates-und-verschachteltes-stl-objekt</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 22:00:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277320.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Nov 2010 19:56:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Tue, 16 Nov 2010 19:56:20 GMT]]></title><description><![CDATA[<p>Hab mich gerade mit templates etwas beschäftigt und bin auf ein Problem gestoßen, bei dem ich mich schwer tue <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;list&gt;
#include &lt;vector&gt;

template&lt;typename T, typename U&gt;
class TableStyle
{
	private:

	public:
		void print(const T &amp;head, const U &amp;data);
};

template&lt;typename T, typename U&gt;
void TableStyle&lt;T, U&gt;::print(const T &amp;head, const U &amp;data)
{
	typename T::const_iterator iterHead;
	typename U::const_iterator iterData;

	for(iterHead=head.begin(); iterHead!=head.end(); ++iterHead)
		std::cout &lt;&lt; iterHead-&gt;length() &lt;&lt; std::endl;

	// erst ueber std::vector
	for(iterData=data.begin(); iterData!=data.end(); ++iterData)
	{
		// dann noch ueber std::list 
		/*
			An dieser Stelle moechte ich ueber das &quot;innere&quot; Objekt iterieren.
		*/
	}
}

int main()
{
	TableStyle&lt;std::list&lt;std::string&gt;, std::vector&lt;std::list&lt;std::string&gt; &gt; &gt; oTs;

	std::list&lt;std::string&gt; head;
	std::vector&lt;std::list&lt;std::string&gt; &gt; data;

	oTs.print(head, data);
}
</code></pre>
<p>Wie alle sehen, hab ich als 2. Parameter ein verschachteltes Konstrukt (Instanziierung).</p>
<p>Frage 1:<br />
- das std::string soll immer gleich bleiben und nicht durch andere Container ersetzt werden.</p>
<p>Frage 2.<br />
- die Iteration ueber std::list bei data in der Funktion print ist mir ein Rätsel.</p>
<p>Ansätze zu 1. kann ich grad net liefern. Meine Idee wäre, das alles aufzudröseln und mehrere Templateparameter zu übergeben, wobei ich den einen mit std::string fest zuweise, geht natürlich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<pre><code class="language-cpp">template&lt;typename T, typename U, typename V=std::string&gt;

//[...]

template&lt;typename T, typename U, typename V&gt;
void TableStyle&lt;T, U, V&gt;::print(const T &amp;head, const U&lt;V&gt; &amp;data)
</code></pre>
<p>zu 2. viel mir ein, ein temporäres Objekt zu erstellen, und darüber dann zu iterieren ... so:</p>
<pre><code class="language-cpp">std::list&lt;std::string&gt; temp = *iterData;
</code></pre>
<p>Wobei der vordere Teil natürlich wiederum über Templateparameter gesteuert wird.<br />
Das funktioniert zwar, aber geht das auch anders?</p>
<p>Wäre abgefahren, wenn jemand Tipps hat. (Bitte net nach dem Sinn fragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> und ja ... ich habs kompliziert beschrieben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981398</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Tue, 16 Nov 2010 19:56:20 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Tue, 16 Nov 2010 20:26:27 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> suppi ... konnte Frage 2 ganz allein ohne Hilfe lösen ... total simbel</p>
<pre><code class="language-cpp">for(iterData=data.begin(); iterData!=data.end(); ++iterData)
	{
		typename T::const_iterator iterCol;

		for(iterCol=iterData-&gt;begin(); iterCol!=iterData-&gt;end(); ++iterCol)
		{
			std::cout &lt;&lt; *iterCol &lt;&lt; std::endl;
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1981415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981415</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Tue, 16 Nov 2010 20:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Tue, 16 Nov 2010 20:39:46 GMT]]></title><description><![CDATA[<p>Das zweite geht alternativ auch über</p>
<pre><code class="language-cpp">typename U::value_type::const_iterator iterCol;
// anstatt
typename T::const_iterator iterCol;
</code></pre>
<p>Vom ersten verstehe ich den Sinn nicht ganz. Es ist zwar ohne weiteres möglich, nur std::string zu erlauben, aber std::wstring oder char * werden dann verboten, obwohl sie gleiche Funktionalität liefern und m.E. nicht aussen vor gelassen werden sollen.<br />
Falls du darauf beharrst: entweder du verwendest Template-Spezialisierung oder typedef'st V als std::string innerhalb der Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981425</guid><dc:creator><![CDATA[Matrjoschka]]></dc:creator><pubDate>Tue, 16 Nov 2010 20:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Tue, 16 Nov 2010 21:07:45 GMT]]></title><description><![CDATA[<p>Der Sinn ist im Moment durchaus etwas fragwürdig ... ich will quasi<br />
folgendes erreichen:</p>
<pre><code class="language-cpp">std::vector&lt;std::list&lt;std::string&gt; &gt; &gt;
     |           |         |
     variabel    |         |
                 variabel  |
                           fix
</code></pre>
<p>Meine Rechersche führte mich zum EBook &quot;Moderne C++ Programmierung&quot;</p>
<p><a href="http://books.google.de/books?id=Xkp2k8vyUgUC&amp;pg=PA247&amp;lpg=PA247&amp;dq=c%2B%2B+verschachtelte+templateparameter&amp;source=bl&amp;ots=9rfANHnmB_&amp;sig=t9GZDib46cyt5yY70l2jYJIQ4Ks&amp;hl=de&amp;ei=oeviTISIB86UOum80WA&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CDYQ6AEwAw" rel="nofollow">http://books.google.de/books?id=Xkp2k8vyUgUC&amp;pg=PA247&amp;lpg=PA247&amp;dq=c%2B%2B+verschachtelte+templateparameter&amp;source=bl&amp;ots=9rfANHnmB_&amp;sig=t9GZDib46cyt5yY70l2jYJIQ4Ks&amp;hl=de&amp;ei=oeviTISIB86UOum80WA&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CDYQ6AEwAw</a></p>
<p>und brachte bei mir folgendes sinnfreies Gewülst hervor</p>
<pre><code class="language-cpp">template&lt;typename T, template&lt;template&lt;typename V=std::string&gt; class D&gt; class U&gt;
</code></pre>
<p>Ob das nun am Ende Erfolg verspricht, werde ich bald sehen <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/1981451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981451</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Tue, 16 Nov 2010 21:07:45 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Wed, 17 Nov 2010 19:36:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class TableStyle
{
    private:

    public:
        template&lt;typename T1, typename T2, typename T3&gt; void print(const T1&lt;std::string&gt; &amp;head, const T2&lt;T3&lt;std::string&gt; &gt; &amp;data);
};
</code></pre>
<p>Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981928</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 17 Nov 2010 19:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Wed, 17 Nov 2010 19:44:40 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename T1, typename T2, typename T3&gt; void print(const T1&lt;std::string&gt; &amp;head, const T2&lt;T3&lt;std::string&gt; &gt; &amp;data);
</code></pre>
<p>Geht das?</p>
</blockquote>
<p>Nein. Mit <code>typename</code> sagst du explizit, dass es sich bei <code>T1</code> , <code>T2</code> und <code>T3</code> um Typnamen handelt. Du verwendest die drei Bezeichner jedoch als Templates, was keine Typen sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981930</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Nov 2010 19:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Wed, 17 Nov 2010 20:28:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename T1, typename T2, typename T3&gt; void print(const T1&lt;std::string&gt; &amp;head, const T2&lt;T3&lt;std::string&gt; &gt; &amp;data);
</code></pre>
<p>Geht das?</p>
</blockquote>
<p>Nein. Mit <code>typename</code> sagst du explizit, dass es sich bei <code>T1</code> , <code>T2</code> und <code>T3</code> um Typnamen handelt. Du verwendest die drei Bezeichner jedoch als Templates, was keine Typen sind.</p>
</blockquote>
<p>Schade. Dann bleibt wohl für sowas nur die Workaround-Lösung, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981941</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 17 Nov 2010 20:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Wed, 17 Nov 2010 21:14:21 GMT]]></title><description><![CDATA[<p>Naheliegend wären Template-Template-Parameter, welche hier jedoch nicht eingesetzt werden können, da die Anzahl der Template-Parameter bei STL-Containern nicht festgelegt ist (Implementierungen dürfen zusätzliche Default-Parameter verwenden).</p>
<p>Grundsätzlich kann die Klasse so aussehen:</p>
<pre><code class="language-cpp">template &lt;template &lt;typename T&gt; class OuterType, template &lt;typename T&gt; class InnerType&gt;
struct MyClass
{
	typedef typename InnerType&lt;std::string&gt;::Type Inner;
	typedef typename OuterType&lt;Inner&gt;::Type       Outer;
};
</code></pre>
<p>Verwende dann intern die Typedefs, z.B. zur Deklaration von Membervariablen und Iteratoren. Benutzt werden können <code>std::vector</code> und <code>std::list</code> dennoch, aber über eine Indirektion:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct StdVector
{
	typedef std::vector&lt;T&gt; Type;
};

template &lt;typename T&gt;
struct StdList
{
	typedef std::list&lt;T&gt; Type;
};

int main()
{
	MyClass&lt;StdVector, StdList&gt; m;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1981971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981971</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Nov 2010 21:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und verschachteltes STL-Objekt on Thu, 18 Nov 2010 19:44:53 GMT]]></title><description><![CDATA[<p>Hey Nexus ... super Danke. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Ich glaub, des passt, so wie ich es brauch.<br />
Hab es mal eben auf mein Zeugs angewendet. Hoffe das hab ich richtig umgesetzt *g*<br />
Zumindest funktioniert es.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct StdVector
{
    typedef std::vector&lt;T&gt; Type;
};

template &lt;typename T&gt;
struct StdList
{
    typedef std::list&lt;T&gt; Type;
};

template &lt;template &lt;typename T&gt; class InnerType, template &lt;typename T&gt; class OuterType&gt;
class TableStyle
{
	private:
		typedef typename InnerType&lt;std::string&gt;::Type Inner;
		typedef typename OuterType&lt;Inner&gt;::Type       Outer;

		public:
			void print(const Inner &amp;head, const Outer &amp;data);
};

template &lt;template &lt;typename T&gt; class InnerType, template &lt;typename T&gt; class OuterType&gt;
void TableStyle&lt;InnerType, OuterType&gt;::print(const Inner &amp;head, const Outer &amp;data)
{
	typename Inner::const_iterator iterHead;
	typename Outer::const_iterator iterData;

	//[...]
}

int main()
{
	TableStyle&lt;StdList, StdVector&gt; oTs;

	std::list&lt;std::string&gt; head;
	std::vector&lt;std::list&lt;std::string&gt; &gt; data;

	oTs.print(head, data);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1982516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982516</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Thu, 18 Nov 2010 19:44:53 GMT</pubDate></item></channel></rss>