<?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[Die Sache mit den templates]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe soeben templates kennen gelernt. So wie ich es gelernt habe, handelt es sich dabei um eine Art Schablone. Wenn ich also eine Methode vereinbare, aber nicht alles darüber weiß, so kann ich ein template erstellen. Ich habe in einen vorigen Post schon mal ein kleines Programm gezeigt, dass einfach einen String vertauscht. Wenn ich nun beispielsweise nicht weiß, ob ich einen String oder eine Zahl vertauschen möchte, dann könnte ich ja folgendes schreiben:</p>
<pre><code class="language-cpp">template &lt;class AllTyp&gt;
void Exchange (AllTyp &amp;x, AllTyp &amp;y)
{
  AllTyp z = x; x = y; y =z
}
</code></pre>
<p>Leider wird diese doch sehr interessante Sache fast gar nicht angesprochen. Meine Fragen sind nun:</p>
<p>1.) Wann und wie bestimme ich denn dann, um welchen Typ (also String, int…) es sich handelt. Wie wende ich diese Methode an?</p>
<p>2.) Hier handelt es sich ja um eine klassenlose Methode. Warum muss ich bei einem template trotzdem „class“ schreiben?</p>
<p>3.) Kann ich auch ein template von einer Methode machen, die einer Klasse angehört?</p>
<p>Ich hoffe, dass ihr mich versteht!<br />
Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224832/die-sache-mit-den-templates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 03:29:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224832.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Oct 2008 16:23:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die Sache mit den templates on Wed, 15 Oct 2008 16:23:49 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe soeben templates kennen gelernt. So wie ich es gelernt habe, handelt es sich dabei um eine Art Schablone. Wenn ich also eine Methode vereinbare, aber nicht alles darüber weiß, so kann ich ein template erstellen. Ich habe in einen vorigen Post schon mal ein kleines Programm gezeigt, dass einfach einen String vertauscht. Wenn ich nun beispielsweise nicht weiß, ob ich einen String oder eine Zahl vertauschen möchte, dann könnte ich ja folgendes schreiben:</p>
<pre><code class="language-cpp">template &lt;class AllTyp&gt;
void Exchange (AllTyp &amp;x, AllTyp &amp;y)
{
  AllTyp z = x; x = y; y =z
}
</code></pre>
<p>Leider wird diese doch sehr interessante Sache fast gar nicht angesprochen. Meine Fragen sind nun:</p>
<p>1.) Wann und wie bestimme ich denn dann, um welchen Typ (also String, int…) es sich handelt. Wie wende ich diese Methode an?</p>
<p>2.) Hier handelt es sich ja um eine klassenlose Methode. Warum muss ich bei einem template trotzdem „class“ schreiben?</p>
<p>3.) Kann ich auch ein template von einer Methode machen, die einer Klasse angehört?</p>
<p>Ich hoffe, dass ihr mich versteht!<br />
Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599501</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 15 Oct 2008 16:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den templates on Wed, 15 Oct 2008 17:01:53 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>1.) Wann und wie bestimme ich denn dann, um welchen Typ (also String, int…) es sich handelt. Wie wende ich diese Methode an?</p>
</blockquote>
<p>Du gibst den Typen im Quelltext an, der Compiler erstellt während der Übersetzung eine Funktion mit den konkreten Typen.</p>
<pre><code class="language-cpp">int a = 4;
int b = 6;
Exchange&lt;int&gt;(a, b);
</code></pre>
<p>freakC++ schrieb:</p>
<blockquote>
<p>2.) Hier handelt es sich ja um eine klassenlose Methode. Warum muss ich bei einem template trotzdem „class“ schreiben?</p>
</blockquote>
<p>class dient hier als Schlüsselwort um anzuzeigen, dass AllTyp der zu definierende Datentyp ist. Du kannst auch typename verwenden, wenn es für Dich besser lesbar ist.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>3.) Kann ich auch ein template von einer Methode machen, die einer Klasse angehört?</p>
</blockquote>
<p>Ja, Du kannst sogar eine gesamte Klassenschablone definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599534</guid><dc:creator><![CDATA[witte]]></dc:creator><pubDate>Wed, 15 Oct 2008 17:01:53 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den templates on Thu, 16 Oct 2008 10:27:40 GMT]]></title><description><![CDATA[<p>Anfangs gab es in Verbindung mit dem Schlüsselwort <strong>template</strong> tatsächlich nur das Schlüsselwort <strong>class</strong>. Über diesen Stolperstein sind wohl einige gefallen, denn class steht hier für jeden beliebigen Datentyp (auch die built-in Typen wie bool, int, double, etc.). Aus diesem Grund wurde später das Schlüsselwort <strong>typename</strong> ergänzt, das in der Definition von template Funktionen oder Klassen die gleiche Funktion besitzt wie <strong>class</strong>.<br />
Folgende Definitionen sind also identisch:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
void template_func( const T&amp; op );

und

template&lt;typename T&gt;
void template_func( const T&amp; op );
</code></pre>
<p>Welche Funktion der Compiler aus einem template erzeugt hängt davon ab, ob er genügend Informationen über die Parameter und deren Typen erhält. Der Begriff dazu lautet template argument deduction. Angenommen, du hast folgende template Funktion:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
void print( const T&amp; op )
{
   std::cout &lt;&lt; op &lt;&lt; endl;
}

int main()
{
   int Integer = 17;
   double Double = 5.2;

   print( Integer );
   print( Double );
}
</code></pre>
<p>Beim Aufruf von print() gibst du der Funktion ein Argument eines bestimmten Typs mit, beim ersten Aufruf ist es ein int, beim zweiten ein double. Aufgrund dieser Argumente kann der Compiler selbstständig erkennen und entscheiden, welche Funktionen er erzeugen muss (einmal eine für den Typ int und eine für den Typ double).<br />
Anders sieht es aus, wenn diese Informationen fehlen (z.B. wenn keine Parameter übergeben werden. Dann fehlt dem Compiler jegliche Information über den benutzten Typ). In diesem Fall musst du explizit angeben, für welchen Typ du eine template Funktion erzeugen willst.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T create_default()
{
   T theT;
   return theT;
}

int main()
{
   int DefaultInt = create_default&lt;int&gt;();
}
</code></pre>
<p>Genaugenommen musst du nur die template argument typen angeben, die der Compiler nicht automatisch erkennen kann. Nehmen mir mal eine einfache Funktion, die den Mittelwert aus zwei Zahlen bestimmen soll:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
double avg( T op1, T op2 )
{
   return static_cast&lt;double&gt;( op1 + op2 ) / 2;
}

double average = avg( 3,4 );
</code></pre>
<p>Funktioniert hervorragend für alle Zahlentypen. Naja, für fast alle. Probleme gibt´s dann, wenn du das für komplexe Zahlen machen willst, da reicht der double als Rückgabetyp nicht mehr aus. Also muss die Funktion um den Rückgabetyp erweitert werden:</p>
<pre><code class="language-cpp">template&lt;typename Result, typename Argument&gt;
Result avg( const Argument&amp; op1, const Argument&amp; op2 )
{
   return static_cast&lt;Result&gt;( op1 + op2 ) / 2;
}

// angenommen, es gäbe den Datentyp complex_t (könnte ein 
// typedef auf std::complex&lt;double&gt; sein.
complex_t c1,c2,r;

// explizite Spezifikation beider template argument typen
r = avg&lt;complex_t, complex_t&gt;( c1,c2 );

// explizite Spezifikation des ersten template argument typen,der zweite 
// kann vom Compiler durch die übergebenen Variablen erkannt werden
r = avg&lt;complex_t&gt;( c1,c2 );
</code></pre>
<p>Den Typ für das zweite Template Argument kann der Compiler aus dem Aufruf generieren, da er ja die Parameter kennt. Den Typ für den Rückgabewert musst du allerdings explizit angeben, da der Compiler ihn nicht bestimmen kann.</p>
<p>Wenn du dich ernsthaft mit templates auseinandersetzen willst kann ich dir folgende Bücher empfehlen:</p>
<p>C++ Templates, The Complete Guide von David Candervoorde und Nicolai Josuttis<br />
Modern C++ Design von Andreji Alexandrescu (starker Tobak!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599834</guid><dc:creator><![CDATA[_DocShoe_]]></dc:creator><pubDate>Thu, 16 Oct 2008 10:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den templates on Thu, 16 Oct 2008 11:47:52 GMT]]></title><description><![CDATA[<p><em>DocShoe</em> schrieb:</p>
<blockquote>
<p>Anfangs gab es in Verbindung mit dem Schlüsselwort <strong>template</strong> tatsächlich nur das Schlüsselwort <strong>class</strong>. Über diesen Stolperstein sind wohl einige gefallen, denn class steht hier für jeden beliebigen Datentyp (auch die built-in Typen wie bool, int, double, etc.). Aus diesem Grund wurde später das Schlüsselwort <strong>typename</strong> ergänzt, das in der Definition von template Funktionen oder Klassen die gleiche Funktion besitzt wie <strong>class</strong>.</p>
</blockquote>
<p>Der wesentliche Grund für die Einführung von typename waren AFAIK die Mehrdeutigkeitsprobleme, die sich bei Member-Typen von Templates ergaben - und die Möglichkeit der Verwendung von typename statt class für Template-Parameter war eher ein dadurch ermöglichter nützlicher Nebeneffekt. Das C++-Komitee ist sehr zurückhaltend beim Einführen neuer Schlüsselwörter und tut das gewöhnlich nur, wenn es unumgänglich ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599840</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 16 Oct 2008 11:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den templates on Thu, 16 Oct 2008 11:10:56 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-14774.html" rel="nofollow">akari</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-2.html" rel="nofollow">VCL (C++ Builder)</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599864</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Thu, 16 Oct 2008 11:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den templates on Thu, 16 Oct 2008 11:30:34 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p><em>DocShoe</em> schrieb:</p>
<blockquote>
<p>Anfangs gab es in Verbindung mit dem Schlüsselwort <strong>template</strong> tatsächlich nur das Schlüsselwort <strong>class</strong>. Über diesen Stolperstein sind wohl einige gefallen, denn class steht hier für jeden beliebigen Datentyp (auch die built-in Typen wie bool, int, double, etc.). Aus diesem Grund wurde später das Schlüsselwort <strong>typename</strong> ergänzt, das in der Definition von template Funktionen oder Klassen die gleiche Funktion besitzt wie <strong>class</strong>.</p>
</blockquote>
<p>Der wesentliche Grund für die Einführung von typename waren AFAIK die Mehrdeutigkeitsprobleme, die sich bei Member-Typen von Templates ergaben - und die Möglichkeit der Verwendung von typename statt class für Template-Parameter war eher ein dadurch ermöglichter nützlicher Nebeneffekt. Das C++-Komittee ist sehr zurückhaltend beim Einführen neuer Schlüsselwörter und tut das gewöhnlich nur, wenn es unumgänglich ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
</blockquote>
<p>Das macht wohl mehr Sinn... habe meine Version aus ´ner Schulung aufgeschnappt und war mit der Erklärung auch zufrieden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599875</guid><dc:creator><![CDATA[_DocShoe_]]></dc:creator><pubDate>Thu, 16 Oct 2008 11:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den templates on Thu, 16 Oct 2008 18:22:46 GMT]]></title><description><![CDATA[<p>_DocShoe_ hat bezüglich der Anwendung von Templates schon einiges erläutert, <a href="http://www.cplusplus.com/doc/tutorial/templates.html" rel="nofollow">hier</a> gibts z.B. noch eine Einführung.</p>
<p>Übrigens: Deine <code>Exchange()</code> -Funktion ist bereits in der C++-Standardbibliothek vorhanden; sie heisst <code>std::swap()</code> und befindet sich im Header <code>&lt;algorithm&gt;</code> (siehe auch <a href="http://www.cplusplus.com/reference/algorithm/swap.html" rel="nofollow">hier</a>).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600096</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Oct 2008 18:22:46 GMT</pubDate></item></channel></rss>