<?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[template in template?? Wie und warum?]]></title><description><![CDATA[<p>Hallo leute,</p>
<p>habe grad mal das ausprobiert:</p>
<pre><code class="language-cpp">template&lt;template&lt;typename T&gt; typename U&gt;
class bla
{

};
</code></pre>
<p>Fehler: Template Argumente müssen eine Klasse bezeichnen</p>
<p>Also wie muss es richtig lauten?</p>
<p>Aber viel wichtiger ist die frage, für was braucht man templates in templates wirklich sinnvoll?</p>
<p>Kann mir vielleicht jmd mal ein gut verständliches beispiel geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/139814/template-in-template-wie-und-warum</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 19:17:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/139814.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Mar 2006 14:40:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 14:40:50 GMT]]></title><description><![CDATA[<p>Hallo leute,</p>
<p>habe grad mal das ausprobiert:</p>
<pre><code class="language-cpp">template&lt;template&lt;typename T&gt; typename U&gt;
class bla
{

};
</code></pre>
<p>Fehler: Template Argumente müssen eine Klasse bezeichnen</p>
<p>Also wie muss es richtig lauten?</p>
<p>Aber viel wichtiger ist die frage, für was braucht man templates in templates wirklich sinnvoll?</p>
<p>Kann mir vielleicht jmd mal ein gut verständliches beispiel geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1012526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012526</guid><dc:creator><![CDATA[ahjoudou]]></dc:creator><pubDate>Thu, 09 Mar 2006 14:40:50 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 15:18:59 GMT]]></title><description><![CDATA[<p>hier ein kleines beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
using namespace std;

template&lt;typename T&gt;
struct Summierer
{
	template&lt;template&lt;typename&gt; class TContainer&gt;
	T operator()(const TContainer&lt;T&gt; &amp;container)
	{
		T ergebnis = 0;
		for(typename TContainer&lt;T&gt;::const_iterator iter = container.begin(); iter!=container.end(); ++iter)
			ergebnis += (*iter);
		return ergebnis;
	}
};

int main()
{
	Summierer&lt;int&gt; summiere;
	list&lt;int&gt; test;
	test.push_back(32);
	test.push_back(8);
	test.push_back(10);

	cout &lt;&lt; summiere(test) &lt;&lt; endl;
	cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1012562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012562</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Thu, 09 Mar 2006 15:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 15:25:30 GMT]]></title><description><![CDATA[<p>wenn man nur STL-Container erwartet, kann man es natürlich auch so machen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
using namespace std;

struct Summierer
{
    template&lt;typename TContainer&gt;
    typename TContainer::value_type operator()(const TContainer &amp;container)
    {
        typename TContainer::value_type ergebnis = 0;
        for(typename TContainer::const_iterator iter = container.begin(); iter!=container.end(); ++iter)
            ergebnis += (*iter);
        return ergebnis;
    }
};

int main()
{
    Summierer summiere;
    list&lt;int&gt; test;
    test.push_back(32);
    test.push_back(8);
    test.push_back(10);

    cout &lt;&lt; summiere(test) &lt;&lt; endl;
    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1012568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012568</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Thu, 09 Mar 2006 15:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 15:30:05 GMT]]></title><description><![CDATA[<p>@schorsch, was hat das jetzt mit template-templates zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1012573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012573</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Thu, 09 Mar 2006 15:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 15:45:16 GMT]]></title><description><![CDATA[<p>in der ersten version werden template-templates benutzt. dort wird festgelegt, dass als template nur template-typen mit einem bestimmten typ als parameter zugelassen sind. die instanz von Summierer&lt;int&gt; zum beispiel, nimmt nur template-typen, die int als template-typ haben, als parameter.<br />
die zweite version benutzt hingegen keine template-templates. dort können alle möglichen typen (nicht nur template-typen mit festgelegem template-typ) als template-typ verwendet werden, sofern die schnittstellen unterstützt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1012583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012583</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Thu, 09 Mar 2006 15:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 15:51:40 GMT]]></title><description><![CDATA[<p>hier noch mal zur veranschaulichung:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
using namespace std;

template&lt;typename T&gt;
struct Summierer
{
    template&lt;template&lt;typename&gt; class TContainer&gt;
    T operator()(const TContainer&lt;T&gt; &amp;container)
    {
        T ergebnis = T();
        for(typename TContainer&lt;T&gt;::const_iterator iter = container.begin(); iter!=container.end(); ++iter)
            ergebnis += (*iter);
        return ergebnis;
    }
};

int main()
{
    Summierer&lt;int&gt; summiereNurTemplateTypenMitIntAlsTemplateTyp;
    Summierer&lt;double&gt; summiereNurTemplateTypenMitDoubleAlsTemplateTyp;

    list&lt;int&gt; test;
    test.push_back(32);
    test.push_back(8);
    test.push_back(10);

	//ok! list&lt;int&gt; als Template-Typ mit int als Template-Typ!
    cout &lt;&lt; summiereNurTemplateTypenMitIntAlsTemplateTyp(test) &lt;&lt; endl;

    //folgendes geht nicht!!! Template-Typen mit double als Template-Typ sind gefordert!
    //cout &lt;&lt; summiereNurTemplateTypenMitDoubleAlsTemplateTyp(test) &lt;&lt; endl;

    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1012591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012591</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Thu, 09 Mar 2006 15:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Thu, 09 Mar 2006 22:58:17 GMT]]></title><description><![CDATA[<p>Doof nur, dass ein Standard-Container kein gültiges Argument für eine Template-Funktion ist, die als Parameter ein Template vom Typ const TContainer&lt;T&gt; erwartet. Template-Template-Parameter müssen immer exakt passen. Default-Werte werden ignoriert. Demzufolge müsste deine Template-Template-Parameter zwei Template-Parameter unterstützen - der zweite für den Allocator-Type. Das wäre aber auch nicht portabel, da der Standard die genaue Anzahl der Template-Parameter für die Standard-Container nicht festlegt. Jeder Standard-Bibliothek kann also beliebig viele weitere Template-Parameter hinzufügen (solange diese alle Default-Werte haben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1012928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1012928</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 09 Mar 2006 22:58:17 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Fri, 10 Mar 2006 08:54:24 GMT]]></title><description><![CDATA[<p>Oh <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Dass Default-Werte für Template-Parameter ignoriert werden, wusste ich nicht. Template-Template-Parameter in direkter Verbindung mit Standard-Containern zu benutzen macht dann wohl wenig Sinn. Ein (ziemlich hässlicher) Workaround dafür, wäre natürlich eine Ableitung zu benutzen, wo die zusätzlichen Template-Parameter fest verdrahtet sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1013041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1013041</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Fri, 10 Mar 2006 08:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Fri, 10 Mar 2006 09:58:21 GMT]]></title><description><![CDATA[<p>Eine bessere Lösung ist es wohl, einen beliebigen Container zu erwarten (hat auch den Vorteil, daß du damit eine list&lt;float&gt; durch einen Summierer&lt;int&gt; jagen könntest ;)).</p>
<p>PS: Und noch eine Option: Die STL bietet auch <em>Algorithmen</em> an - z.B. accumulate(), der hier wohl ideal einzusetzen wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1013090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1013090</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 10 Mar 2006 09:58:21 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Fri, 10 Mar 2006 12:43:19 GMT]]></title><description><![CDATA[<p>Ist ja schon gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Das war ein blödes, weil praxisfernes, Beispiel, aber ein paar Eigenheiten von Template-Templates sind bei rumgekommen. Die Vorteile wurden wahrscheinlich nicht so richtig klar, deshalb hier ein anderes Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Wurst
{
public:
	static const char *produkt() { return &quot;Wurst&quot;; }
};

class Gehacktes
{
public:
	static const char *produkt() { return &quot;Gehacktes&quot;; }
};

template&lt;typename TProdukt&gt;
class SchweineMetzger
{
public:
	static void produkt() { cout &lt;&lt; &quot;Schweine-&quot; &lt;&lt; TProdukt::produkt() &lt;&lt; endl; }
};

template&lt;typename TProdukt&gt;
class RinderMetzger
{
public:
	static void produkt() { cout &lt;&lt; &quot;Rinder-&quot; &lt;&lt; TProdukt::produkt() &lt;&lt; endl; }
};

template&lt;template&lt;typename&gt; class TMetzger&gt;
class Metzgerei
{
public:
    static void wurst() { TMetzger&lt;Wurst&gt;::produkt(); }
    static void gehacktes() { TMetzger&lt;Gehacktes&gt;::produkt(); }
};

int main()
{
	Metzgerei&lt;SchweineMetzger&gt;::wurst();
	Metzgerei&lt;SchweineMetzger&gt;::gehacktes();
	Metzgerei&lt;RinderMetzger&gt;::wurst();
	Metzgerei&lt;RinderMetzger&gt;::gehacktes();

    cin.get();
}
</code></pre>
<p>Die Metzgerei nimmt einen Metzger als Template-Template-Parameter. Dieser kann dann von der Metzgerei mit Produkten konfiguriert werden, indem sie ihm als Template-Parameter übergeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1013251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1013251</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Fri, 10 Mar 2006 12:43:19 GMT</pubDate></item><item><title><![CDATA[Reply to template in template?? Wie und warum? on Fri, 10 Mar 2006 12:53:30 GMT]]></title><description><![CDATA[<p>Wobei es natürlich lässiger ist, wenn man nicht für jedes neue Produkt eine neue Methode in der Metzgerei braucht:</p>
<pre><code class="language-cpp">//...
template&lt;template&lt;typename&gt; class TMetzger&gt;
class Metzgerei
{
public:
    template&lt;typename TProdukt&gt;
    static void produkt() { TMetzger&lt;TProdukt&gt;::produkt(); }
};

int main()
{
    Metzgerei&lt;SchweineMetzger&gt;::produkt&lt;Wurst&gt;();
    Metzgerei&lt;SchweineMetzger&gt;::produkt&lt;Gehacktes&gt;();
    Metzgerei&lt;RinderMetzger&gt;::produkt&lt;Wurst&gt;();
    Metzgerei&lt;RinderMetzger&gt;::produkt&lt;Gehacktes&gt;();

    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1013256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1013256</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Fri, 10 Mar 2006 12:53:30 GMT</pubDate></item></channel></rss>