<?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 oder abstracte Klasse]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende Situation.<br />
Ich habe 3 Container Arten.</p>
<pre><code>Array, List und Vector.
</code></pre>
<p>Alle haben die Methode</p>
<pre><code>GetData( const Key&amp; key  )
</code></pre>
<p>Nun habe ich eine Funktion die mit den Daten eines Containers arbeitet.<br />
Wie ist es nun am geschicktesten, die Funktion zu machen.</p>
<p>So:</p>
<pre><code class="language-cpp">template&lt; class T &gt;
class Container
{
public:
    virtual ~Container() = 0;
    virtual T GetData( const Key&amp; key );
};

template&lt; class T &gt;
class Array : public Container&lt; T &gt;;

template&lt; class T &gt;
class List : public Container&lt; T &gt;;

template&lt; class T &gt;
class Vector : public Container&lt; T &gt;;

template&lt; class T &gt;
void Function( Container&lt; T &gt;&amp; container )
{
    container.GetData( key );
}
</code></pre>
<p>oder so:</p>
<pre><code class="language-cpp">template&lt; class T &gt;
class Array;

template&lt; class T &gt;
class List;

template&lt; class T &gt;
class Vector;

template&lt; class T &gt;
void Function( const T&amp; container )
{
    container.GetData( key );
}
</code></pre>
<p>Beim ersten Beispiel geht man ja sicher, dass wirklich NUR Container angegeben<br />
werden könne. Dafür trägt man die Polymorphie mit sich herum, was ein bischen Performance kostet?</p>
<p>Was ist besser bzw. üblicher?</p>
<p>( Die Funktion ist nur ein Beispiel, es geht nur darum, ob man mit<br />
Vererbung oder Templates arbeiten sollte )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221299/templates-oder-abstracte-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 08:13:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221299.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Aug 2008 14:38:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates oder abstracte Klasse on Wed, 27 Aug 2008 14:38:19 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende Situation.<br />
Ich habe 3 Container Arten.</p>
<pre><code>Array, List und Vector.
</code></pre>
<p>Alle haben die Methode</p>
<pre><code>GetData( const Key&amp; key  )
</code></pre>
<p>Nun habe ich eine Funktion die mit den Daten eines Containers arbeitet.<br />
Wie ist es nun am geschicktesten, die Funktion zu machen.</p>
<p>So:</p>
<pre><code class="language-cpp">template&lt; class T &gt;
class Container
{
public:
    virtual ~Container() = 0;
    virtual T GetData( const Key&amp; key );
};

template&lt; class T &gt;
class Array : public Container&lt; T &gt;;

template&lt; class T &gt;
class List : public Container&lt; T &gt;;

template&lt; class T &gt;
class Vector : public Container&lt; T &gt;;

template&lt; class T &gt;
void Function( Container&lt; T &gt;&amp; container )
{
    container.GetData( key );
}
</code></pre>
<p>oder so:</p>
<pre><code class="language-cpp">template&lt; class T &gt;
class Array;

template&lt; class T &gt;
class List;

template&lt; class T &gt;
class Vector;

template&lt; class T &gt;
void Function( const T&amp; container )
{
    container.GetData( key );
}
</code></pre>
<p>Beim ersten Beispiel geht man ja sicher, dass wirklich NUR Container angegeben<br />
werden könne. Dafür trägt man die Polymorphie mit sich herum, was ein bischen Performance kostet?</p>
<p>Was ist besser bzw. üblicher?</p>
<p>( Die Funktion ist nur ein Beispiel, es geht nur darum, ob man mit<br />
Vererbung oder Templates arbeiten sollte )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572298</guid><dc:creator><![CDATA[templatepoly]]></dc:creator><pubDate>Wed, 27 Aug 2008 14:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Templates oder abstracte Klasse on Wed, 27 Aug 2008 14:55:21 GMT]]></title><description><![CDATA[<p>Die erste Variante wird nur funktionieren, wenn man beim Funktionsaufruf den Templateparameter explizit angibt, da ein lvalue-List&lt;T&gt; eben kein Container&lt;T&gt; ist, sondern nur in ein solches konvertiert werden kann - da Container&lt;T&gt; ein deduzierbarer Kontext ist, aber für List,Array,Vector gerade kein Templateargument hergeleitet werden kann (bzw. für diesen Parameter die entsprechende Konvertierung unterdrückt wird).<br />
Variante zwei kann man entsprechend anpassen, z.B.</p>
<pre><code class="language-cpp">template&lt; class T, template&lt;typename&gt;class C&gt;
typename enable_if&lt;is_base_of&lt;Container&lt;T&gt;,C&lt;T&gt; &gt; &gt;::type Function( const C&lt;T&gt;&amp; container )
{
    container.GetData( key );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1572308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572308</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 27 Aug 2008 14:55:21 GMT</pubDate></item></channel></rss>