<?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: Vererbung des Template Typs?]]></title><description><![CDATA[<p>Könnte mir vielleicht jemand beantworten: Ob es möglich ist, ein Template bei einer Funktion so zu definieren, dass auch alle Unterklassen des Typs für das Template gültig sind.</p>
<p>--<br />
alex.partsch</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274278/templates-vererbung-des-template-typs</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 17:15:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274278.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Sep 2010 22:11:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:11:49 GMT]]></title><description><![CDATA[<p>Könnte mir vielleicht jemand beantworten: Ob es möglich ist, ein Template bei einer Funktion so zu definieren, dass auch alle Unterklassen des Typs für das Template gültig sind.</p>
<p>--<br />
alex.partsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956224</guid><dc:creator><![CDATA[alex.partsch]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:14:35 GMT]]></title><description><![CDATA[<p>Ich würde ausnutzen, daß Referenzen das können.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void foo(T&amp; t){
  machwas(t);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1956226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956226</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:15:58 GMT]]></title><description><![CDATA[<p>@ alex.partsch: Könntest du deine Frage an einem kleinen Stück Code verdeutlichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956227</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:28:44 GMT]]></title><description><![CDATA[<p>alex.partsch schrieb:</p>
<blockquote>
<p>Könnte mir vielleicht jemand beantworten: Ob es möglich ist, ein Template bei einer Funktion so zu definieren, dass auch alle Unterklassen des Typs für das Template gültig sind.</p>
</blockquote>
<p>Bitte was? Von was für einem Typ sprichst Du und was genau meinst Du mit &quot;gültig&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956228</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:28:57 GMT]]></title><description><![CDATA[<p>Ich habe folgende Methode:</p>
<pre><code class="language-cpp">void QQueueThread::startWorking() {
    if(started)
        return ; // workers allready work

    this-&gt;workers = new QList&lt;T *&gt;;
    for(int cores = this-&gt;cores; cores &gt; 0; cores--) {
        QQueueWorker *worker = new QQueueWorker(this-&gt;majorQueue, this);
        workers &lt;&lt; worker;
    }

    // all workers are created ... start
    foreach(QQueueWorker *worker, this-&gt;workers)
        worker-&gt;start();

    started = true;
}
</code></pre>
<p>diese macht nichts weiter als eine Liste zur erzeugen und Pointer auf QQueueWorker anzulegen ... jedoch sollten die QQueueWorker eine abstrakte Klasse sein; also dachte ich mir das man durch Templates, sozusagen den Typ der Klasse angeben könnte und ich dann aus dieser Information die Worker-Objekte hierfür erzeugen könnte!</p>
<p>Nur leider bin ich mir nicht ganz sicher wie ich das template so definiere, dass auch alle Unterklassen von QQueueWorker übergeben werden können.</p>
<p>Vielleicht kann dies noch etwas helfen:<br />
In Java würde man es am besten so realisieren:</p>
<pre><code class="language-java">// random ...
public static &lt;? extends CharSequence&gt; T Add(T t1, T t2) {
    return t1.Concat(t2);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1956229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956229</guid><dc:creator><![CDATA[alex.partsch]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:41:12 GMT]]></title><description><![CDATA[<p>Also meinst du sowas?</p>
<pre><code class="language-cpp">template&lt;typename WorkerT&gt;
void QQueueThread&lt;WorkerT&gt;::startWorking() { 
    if(started) 
        return ; // workers allready work 

    this-&gt;workers = new QList&lt;WorkerT*&gt;; 
    for(int cores = this-&gt;cores; cores &gt; 0; cores--) { 
        WorkerT *worker = new WorkerT(this-&gt;majorQueue, this); 
        workers &lt;&lt; worker; 
    } 

    // all workers are created ... start 
    foreach(WorkerT *worker, this-&gt;workers) 
        worker-&gt;start(); 

    started = true; 
}
</code></pre>
<p>C++ Templates werden zur Kompilezeit ausgewertet. Der Kompiler schaut einfach, ob die Klasse die entsprechende Schnittstelle, welche man benötigt, auch anbietet. Das ist zur Kompilezeit für den Kompiler auch kein Problem. Da muss man nichts speziell angeben.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956235</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:41:12 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Wed, 22 Sep 2010 22:49:21 GMT]]></title><description><![CDATA[<p>alex.partsch schrieb:</p>
<blockquote>
<p>Vielleicht kann dies noch etwas helfen:<br />
In Java würde man es am besten so realisieren:</p>
<pre><code class="language-java">// random ...
public static &lt;? extends CharSequence&gt; T Add(T t1, T t2) {
    return t1.Concat(t2);
}
</code></pre>
</blockquote>
<p>Bitte programmiere kein Java in C++. Java Generics und C++ Templates haben auch nicht allzu viel miteinander zu tun. Eine solche &quot;Java-generische&quot; Funktion wird nur einmal übersetzt. Hier ist das &quot;extends CharSequence&quot; notwendig, damit sich die Funktion kompilieren lässt; denn sonst wüsste der Compiler nicht, was Du mit <code>Concat</code> meinst. In C++ ist ein Funktionstemplate keine Funktion, sondern eben -- *Trommelwirbel* -- ein Funktionstemplate, auf Deutsch: eine Funktions-Schablone. Zur Compile-Zeit wird/werden aus der Schablone null bis mehrere konkrete Funktionen für verschiedene Template-Parameter-Kombination erzeugt. Wenn dabei etwas nicht passt (zB gibt es kein <code>T::Concat</code> ), bekommst Du eben einen Kompilierungsfehler während das Template instantiiert wird.</p>
<p>Man kann aber, wenn man will, die Schablonen einschränken. Das kann zB dann sinnvoll sein, wenn man möchte, dass der Compiler das eine oder andere Funktions-Template ignoriert, falls bestimmte Bedingungen nicht erfüllt sind, so dass einige Funktionstemplates erst gar nicht in das &quot;Overload resolution set&quot; kommen. Das kann dann so aussehen:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
typename boost::enable_if&lt;
  boost::is_convertible&lt;T*,MeineBasisKlasse*&gt;
&gt;::type foo(T* zeiger)
{
  // Wir wissen hier, dass zeiger implizit
  // nach MeineBasisKlasse* konvertierbar ist, also
  // dass T entweder MeineBasisKlasse oder eine von
  // MeineBasisKlasse oeffentlich abgeleitete Klasse ist.
  ...
}
</code></pre>
<p>(Diesen Trick findet man unter dem Stichwort &quot;SFINAE&quot; -- substitution failure is not an error). Falls die Bedingung is_convertible&lt;T*,MeineBasisKlasse*&gt; nicht erfüllt ist, führt das Einsetzen vom deduzierten Typparameter T in die Funktionssignatur zu einem direkten Ersetzungsfehler, was den Compiler dazu veranlässt, das Template zu ignorieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956236</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 22 Sep 2010 22:49:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Thu, 23 Sep 2010 04:47:14 GMT]]></title><description><![CDATA[<p>Ich hätte das jetzt mit std::tr1::is_base_of gemacht. Mit is_convertible nimmt er dir auch void ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956250</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 23 Sep 2010 04:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Vererbung des Template Typs? on Thu, 23 Sep 2010 06:54:48 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Ich hätte das jetzt mit std::tr1::is_base_of gemacht. Mit is_convertible nimmt er dir auch void ab.</p>
</blockquote>
<p>void* ist nicht implizit nach MeineBasisKlasse* konvertierbar, also kann T auch nie void sein.</p>
<p>Der Unterschied zwischen is_base_of und is_convertible müsste sich darauf beschränken, dass is_base_of auch private Vererbung erkennt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956263</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 23 Sep 2010 06:54:48 GMT</pubDate></item></channel></rss>