<?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[Verwendung und erstellung von templates.]]></title><description><![CDATA[<p>Hallo !<br />
Wie der Titel schon sagt , würde ich gerne wissen , wie ,wo und warum man templates benutzt.<br />
Ich habe mir die templates schon angesehen , doch konte ich nicht wircklich einen nutzen daraus für mich erkennen.</p>
<p>Es wäre schön , wenn mir jemand das mal näher erläutern würde , vielleicht mit einem kleinen beispiel.</p>
<p>Dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294404/verwendung-und-erstellung-von-templates</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 22:42:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294404.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Oct 2011 16:08:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 16:08:27 GMT]]></title><description><![CDATA[<p>Hallo !<br />
Wie der Titel schon sagt , würde ich gerne wissen , wie ,wo und warum man templates benutzt.<br />
Ich habe mir die templates schon angesehen , doch konte ich nicht wircklich einen nutzen daraus für mich erkennen.</p>
<p>Es wäre schön , wenn mir jemand das mal näher erläutern würde , vielleicht mit einem kleinen beispiel.</p>
<p>Dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135226</guid><dc:creator><![CDATA[_D]]></dc:creator><pubDate>Mon, 24 Oct 2011 16:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 16:15:29 GMT]]></title><description><![CDATA[<p>Wenn du eine Funktion oder eine Klasse als allgemeines Konzept ausdrücken möchtest, das nicht direkt an den Datentyp gebunden ist, aber trotzdem typsicher bleibt. (Das meiste ginge halt auch mit void* Pointern, ist aber wesentlich frickeliger, soll heißen, schlechter zu schreiben, schlechter zu lesen und damit auch schlechter zu warten.)</p>
<p>Schönes Beispiel ist die Funktion qsort() aus C (void* Pointer) und die Funktion std::sort aus C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135232</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 24 Oct 2011 16:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 16:15:51 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte dir das an einem Beispiel kurz erklären.</p>
<pre><code class="language-cpp">//für die Multplikation von 2 Zahlen brauchst du

int multiInt(int,int);
double multiDouble(double,double);
short multiShort(short, short);

//mehrere solcher Methoden aber als template nur eine:
template &lt;typename T&gt;
T mutli(T x, T y)
{
    return x*y;
}
</code></pre>
<p>du kannst sie ganz gewöhnlich mit multi(5,6) oder multi(5.0,6.0);<br />
Im ersten Fall wird int und im Zwieten Fall T mit double ersetzt <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="🙂"
    /><br />
Ich hoffe konnte dir ein wenig helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135233</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Mon, 24 Oct 2011 16:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 16:30:33 GMT]]></title><description><![CDATA[<p>Sieh dir mal die STL (Standard <strong>Template</strong> Library) und die STL-Algorithmen an. Nur durch Templates wurden Container überhaupt &quot;möglich&quot;, und wenn du dir mal Sachen wie printf und cout vergleichst, kannst du ja gleich sehen, wo der Sinn liegt.</p>
<pre><code class="language-cpp">std::string HW(&quot;Hello World!&quot;);

printf(&quot;%s&quot;, HW.c_str());//Musst den Typ angeben

std::cout &lt;&lt; HW;//erklärt sich von selbst
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2135237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135237</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 16:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 17:13:16 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::cout &lt;&lt; HW;//erklärt sich von selbst
</code></pre>
</blockquote>
<p>Das hat ungefähr gar nichts damit zu tun, dass es sich bei diesem operator&lt;&lt; um eine Funktionsvolage handelt, sondern ginge auch mit normaler Funktionsüberladung. Allerdings müsste man ohne Templates für std::string und std::wstring zweimal praktisch den gleichen Code schreiben (und auch den praktisch gleichen operator&lt;&lt;).</p>
<p>Interessanter wird es aber da, wo es um Typen geht, die noch nicht bekannt sind, wenn die Template geschrieben wird. Zum Beispiel ist es mir problemlos möglich,</p>
<pre><code class="language-cpp">struct point {
  double x;
  double y;
};

bool operator&lt;(point const &amp;lhs, point const &amp;rhs) {
  return lhs.x &lt; rhs.x || (lhs.x == rhs.x &amp;&amp; lhs.y &lt; rhs.y);
}

...

std::vector&lt;point&gt; v;
std::sort(v.begin(), v.end());
</code></pre>
<p>schreiben, obwohl weder der Autor von std::vector noch der von std::sort etwas von meinem Typen point wussten.</p>
<p>Noch viel interessanter wird es da, wo man anhand der Eigenschaften bestimmter Typen passenden Code auswählt (mithin Template-Metaprogrammierung betreibt). Ich nehme als einfaches Beispiel mal die Implementation von std::distance aus GNUs libstdc++:</p>
<pre><code class="language-cpp">template&lt;typename _InputIterator&gt;
    inline typename iterator_traits&lt;_InputIterator&gt;::difference_type
    __distance(_InputIterator __first, _InputIterator __last,
               input_iterator_tag)
    {
      // concept requirements
      __glibcxx_function_requires(_InputIteratorConcept&lt;_InputIterator&gt;)

      typename iterator_traits&lt;_InputIterator&gt;::difference_type __n = 0;
      while (__first != __last)
        {
          ++__first;
          ++__n;
        }
      return __n;
    }

  template&lt;typename _RandomAccessIterator&gt;
    inline typename iterator_traits&lt;_RandomAccessIterator&gt;::difference_type
    __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
               random_access_iterator_tag)
    {
      // concept requirements
      __glibcxx_function_requires(_RandomAccessIteratorConcept&lt;
                                  _RandomAccessIterator&gt;)
      return __last - __first;
    }

  template&lt;typename _InputIterator&gt;
    inline typename iterator_traits&lt;_InputIterator&gt;::difference_type
    distance(_InputIterator __first, _InputIterator __last)
    {
      // concept requirements -- taken care of in __distance
      return std::__distance(__first, __last,
                             std::__iterator_category(__first));
    }
</code></pre>
<p>Wodurch Random-Access-Iteratoren wie Zeiger oder std::vector&lt;&gt;::*iterator wesentlich effizienter behandelt werden können als etwa std::istream_iterator oder std::list&lt;&gt;::*iterator, bei denen der Abstand nicht direkt ausgelesen werden kann, sondern mühsam quasi ausprobiert werden muss.</p>
<p>Man kann auf diese und ähnliche Weisen natürlich noch <em>wesentlich</em> komplexere Dinge machen. Auf die Spitze getrieben haben es wohl die Leute von Boost.MPL (wahlweise die von Boost.Proto), aber was das macht, krieg ich nicht in einem Forumspost erklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135259</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 24 Oct 2011 17:13:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 17:38:15 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::cout &lt;&lt; HW;//erklärt sich von selbst
</code></pre>
</blockquote>
<p>Das hat ungefähr gar nichts damit zu tun, dass es sich bei diesem operator&lt;&lt; um eine Funktionsvolage handelt, sondern ginge auch mit normaler Funktionsüberladung. Allerdings müsste man ohne Templates für std::string und std::wstring zweimal praktisch den gleichen Code schreiben (und auch den praktisch gleichen operator&lt;&lt;).</p>
</blockquote>
<p>Das war garnicht der Punkt. Willst du den Operator für jeden einzelnen Basisdatentypen überladen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135268</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 17:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 17:44:18 GMT]]></title><description><![CDATA[<p>Ok 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="😃"
    /><br />
Ich hab es jetzt sowit verstanden , das ich jeztz wircklich unabhängie funktionen schreiben kann.</p>
<p>Ich hab das mit dem</p>
<pre><code class="language-cpp">template&lt;typname T&gt;
</code></pre>
<p>so verstanden ,das T jeder type sein kann ?!</p>
<p>Nun hab ich aber noch so was gesehen :</p>
<pre><code class="language-cpp">template&lt;class T&gt;
</code></pre>
<p>Was ist das denn ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135270</guid><dc:creator><![CDATA[_D]]></dc:creator><pubDate>Mon, 24 Oct 2011 17:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 17:55:24 GMT]]></title><description><![CDATA[<p>_D schrieb:</p>
<blockquote>
<p>Ok 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="😃"
    /><br />
Ich hab es jetzt sowit verstanden , das ich jeztz wircklich unabhängie funktionen schreiben kann.</p>
<p>Ich hab das mit dem</p>
<pre><code class="language-cpp">template&lt;typname T&gt;
</code></pre>
<p>so verstanden ,das T jeder type sein kann ?!</p>
<p>Nun hab ich aber noch so was gesehen :</p>
<pre><code class="language-cpp">template&lt;class T&gt;
</code></pre>
<p>Was ist das denn ?</p>
</blockquote>
<p>Erstens heißt es typename, zweitens ist da (in diesem Zusammenhang!) kein Unterschied.<br />
Lies das nochmal <a href="http://blogs.msdn.com/b/slippman/archive/2004/08/11/212768.aspx" rel="nofollow">hier</a> durch.</p>
<p>Edit:<br />
Ahh, hab was vergessen. Bei template template Parametern muss es class heißen <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>
<p>Und noch was: Ja, T kann jeder Typ sein, mit ihm können dann aber auch nur(und auch nur überladene, wenns ne Klasse ist) Operatoren genutzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135272</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 17:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 17:58:11 GMT]]></title><description><![CDATA[<p>Also wie jetzt das ist kein unterschied aber Bei template template Parametern muss es class heißen.</p>
<p>Tut mir leid , aber eine kleine erklärung oder Beispiel wären ganz schön</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135278</guid><dc:creator><![CDATA[_D]]></dc:creator><pubDate>Mon, 24 Oct 2011 17:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:02:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class eins,template&lt;class&gt; typename zwei&gt;// Muss nicht typename sondern class
class Foo
{
};
</code></pre>
<p>Zwei definiert eine Klasse, also muss da class hin.</p>
<pre><code class="language-cpp">template&lt;class T&gt;/// Scheißegal
T bigger(T&amp; a, T&amp; b){
    return ((a&gt;b)?a:b);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2135279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135279</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:02:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:04:03 GMT]]></title><description><![CDATA[<p>_D schrieb:</p>
<blockquote>
<p>Also wie jetzt das ist kein unterschied aber Bei template template Parametern muss es class heißen.</p>
</blockquote>
<p>typename und class sind in diesem Zusammenhang gleichwertig. Warum es beides geht steht in dem Link von Hacker doch gut beschrieben.</p>
<p>@Hacker<br />
Natürlich sind die operator &lt;&lt; für Basistypen einzeln überladen. Oder willst du bei &quot;char&quot; lieber die dezimale Darstellung sehen? Was machst du mit void*? Oder mit Fließkommazahlen? Da sind überall unterschiedliche Verhaltensweisen gefordert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135282</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:04:03 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:23:50 GMT]]></title><description><![CDATA[<p>Ahh jaaa <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="😃"
    /><br />
Dann</p>
<pre><code class="language-cpp">cout &lt;&lt; HW &lt;&lt; endl;//endl ist ein Template
</code></pre>
<p>Edit: Ja, cooky, bin schon ziemlich behindert. Erst vor 'ner Stunde sah ich noch <a href="http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/" rel="nofollow">das</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135286</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:26:14 GMT]]></title><description><![CDATA[<p>Muss dich enttäuschen, endl ist auch kein template sondern eine normale Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135290</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 19:34:25 GMT]]></title><description><![CDATA[<p><s>Blubbfisch schreibt Mist</s><br />
Edit: n3242: 27.7.1</p>
<blockquote>
<pre><code class="language-cpp">template &lt;class charT, class traits&gt;
basic_ostream&lt;charT,traits&gt;&amp; endl(basic_ostream&lt;charT,traits&gt;&amp; os);
</code></pre>
</blockquote>
<p>Wobei die Templateargumente natürlich nur weitergegeben werden, ist jetzt nicht gerade <strong>das</strong> Beispiel für Templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135292</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 24 Oct 2011 19:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:30:37 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Muss dich enttäuschen, endl ist auch kein template sondern eine normale Funktion.</p>
</blockquote>
<p><a href="http://msdn.microsoft.com/en-us/library/28675tyt%28v=vs.80%29.aspx" rel="nofollow">Nein</a>. Oder ist das gar spezifisch?<br />
<a href="http://www.cplusplus.com/reference/iostream/manipulators/endl/" rel="nofollow">Denn</a><br />
Aber ich hab mal in nem PDF von ner UNI gelesen:</p>
<blockquote>
<p>endl ist ein Template, auch wenn es von vielen nicht als solches gesehen wird.</p>
</blockquote>
<p>Eig. wär es trotzdem derbst unnötig, draus 'n template zu machen.</p>
<p>Wolln wir Spielen bei der Wiese?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135294</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:30:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:31:53 GMT]]></title><description><![CDATA[<p>Nö, woll ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135296</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:34:41 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Eig. wär es trotzdem derbst unnötig, draus 'n template zu machen.</p>
</blockquote>
<p>Nö. Aus endl ein Template zu machen ist genauso nötig/unnötig wie aus basic_ostream eines zu machen. Und letzteres ist schwer sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135298</guid><dc:creator><![CDATA[spielanschubser]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 18:37:31 GMT]]></title><description><![CDATA[<p>spielverderber schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Eig. wär es trotzdem derbst unnötig, draus 'n template zu machen.</p>
</blockquote>
<p>Nö. Aus endl ein Template zu machen ist genauso nötig/unnötig wie aus basic_ostream eines zu machen. Und letzteres ist schwer sinnvoll.</p>
</blockquote>
<p>versteh nicht was du sagen willst. Es ist also doch nötig? Oder wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135300</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung und erstellung von templates. on Mon, 24 Oct 2011 21:54:07 GMT]]></title><description><![CDATA[<p>Es handelt sich bei endl in diesem Fall tatsächlich um eine Funktion, nämlich std::endl&lt;char, std::char_traits&lt;char&gt; &gt;. Gemacht wird da eine außerhalb dieses Kontextes selten benutzte Form der Parameterdeduktion. Ich kann auch</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
void foo(T x) {
  std::cout &lt;&lt; x &lt;&lt; std::endl;
}

void bar(void (*func)(int)) {
  func(2);
}

int main() {
  bar(foo); // foo ist hier foo&lt;int&gt;
}
</code></pre>
<p>schreiben, muss dann aber mit hochgezogenen Augenbrauen bei den meisten Leuten rechnen, die den Code mal lesen. Man kann auch keine Zeiger auf Templates herumreichen, weil diese zur Laufzeit ja nicht mehr existieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135356</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 24 Oct 2011 21:54:07 GMT</pubDate></item></channel></rss>