<?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[Typ-Unterscheidung bei statischer Polymorphie]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>manchmal möchte man ja bei statischer Polymorphie ein anderes Verhalten für bestimmte Typen.<br />
Wie setzt ihr so etwas um?<br />
Mit Hilfe eines void*</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

void shout_fussballclub(const void*){
	std::cout &lt;&lt; &quot;Fußballclub&quot;;
}

void shout_fussballclub(const int*){
	std::cout &lt;&lt; &quot;FC&quot;;
}

template&lt;typename T&gt;
void shout(const T&amp; t){
	std::cout &lt;&lt; &quot;Erster &quot;;
	shout_fussballclub(&amp;t);
	std::cout &lt;&lt; &quot; Köln...&quot;;
	std::cout &lt;&lt; std::endl;
}

int main(){
	shout(&quot;FC Köln&quot;);
	shout(&quot;Meine&quot;);
	shout(&quot;Nr.&quot;);
	shout(1);
}
</code></pre>
<p>oder mit Template-Funktion:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

template&lt;typename T&gt;
void shout_fussballclub(const T&amp;){
	std::cout &lt;&lt; &quot;Fußballclub&quot;;
}

void shout_fussballclub(const int){
	std::cout &lt;&lt; &quot;FC&quot;;
}

template&lt;typename T&gt;
void shout(const T&amp; t){
	std::cout &lt;&lt; &quot;Erster &quot;;
	shout_fussballclub(t);
	std::cout &lt;&lt; &quot; Köln...&quot;;
	std::cout &lt;&lt; std::endl;
}

int main(){
	shout(&quot;FC Köln&quot;);
	shout(&quot;Meine&quot;);
	shout(&quot;Nr.&quot;);
	shout(1);
}
</code></pre>
<p>oder ganz anders?</p>
<blockquote>
<p>Erster Fußballclub Köln...<br />
Erster Fußballclub Köln...<br />
Erster Fußballclub Köln...<br />
Erster FC Köln...</p>
</blockquote>
<p>Also ich priorisiere (bisher) Version 2, weil man selbst in der Funktion noch die Typ-Info hat, die bei weiteren Funktionsaufrufen hilfreich sein kann.<br />
Hat man evtl. auch Nachteile damit?<br />
Was mir so einfällt - wo ich mich sehr wenig auskenne - ADL...<br />
Gibt es da ein unterschiedliches Verhalten von 'normalen' Funktionen gegenüber Template-Funktionen?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293350/typ-unterscheidung-bei-statischer-polymorphie</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 09:58:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293350.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Oct 2011 10:23:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typ-Unterscheidung bei statischer Polymorphie on Sat, 01 Oct 2011 10:23:58 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>manchmal möchte man ja bei statischer Polymorphie ein anderes Verhalten für bestimmte Typen.<br />
Wie setzt ihr so etwas um?<br />
Mit Hilfe eines void*</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

void shout_fussballclub(const void*){
	std::cout &lt;&lt; &quot;Fußballclub&quot;;
}

void shout_fussballclub(const int*){
	std::cout &lt;&lt; &quot;FC&quot;;
}

template&lt;typename T&gt;
void shout(const T&amp; t){
	std::cout &lt;&lt; &quot;Erster &quot;;
	shout_fussballclub(&amp;t);
	std::cout &lt;&lt; &quot; Köln...&quot;;
	std::cout &lt;&lt; std::endl;
}

int main(){
	shout(&quot;FC Köln&quot;);
	shout(&quot;Meine&quot;);
	shout(&quot;Nr.&quot;);
	shout(1);
}
</code></pre>
<p>oder mit Template-Funktion:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

template&lt;typename T&gt;
void shout_fussballclub(const T&amp;){
	std::cout &lt;&lt; &quot;Fußballclub&quot;;
}

void shout_fussballclub(const int){
	std::cout &lt;&lt; &quot;FC&quot;;
}

template&lt;typename T&gt;
void shout(const T&amp; t){
	std::cout &lt;&lt; &quot;Erster &quot;;
	shout_fussballclub(t);
	std::cout &lt;&lt; &quot; Köln...&quot;;
	std::cout &lt;&lt; std::endl;
}

int main(){
	shout(&quot;FC Köln&quot;);
	shout(&quot;Meine&quot;);
	shout(&quot;Nr.&quot;);
	shout(1);
}
</code></pre>
<p>oder ganz anders?</p>
<blockquote>
<p>Erster Fußballclub Köln...<br />
Erster Fußballclub Köln...<br />
Erster Fußballclub Köln...<br />
Erster FC Köln...</p>
</blockquote>
<p>Also ich priorisiere (bisher) Version 2, weil man selbst in der Funktion noch die Typ-Info hat, die bei weiteren Funktionsaufrufen hilfreich sein kann.<br />
Hat man evtl. auch Nachteile damit?<br />
Was mir so einfällt - wo ich mich sehr wenig auskenne - ADL...<br />
Gibt es da ein unterschiedliches Verhalten von 'normalen' Funktionen gegenüber Template-Funktionen?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125780</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 01 Oct 2011 10:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Typ-Unterscheidung bei statischer Polymorphie on Sat, 01 Oct 2011 10:49:24 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/290594" rel="nofollow">Déjà-vu?</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125788</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 Oct 2011 10:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Typ-Unterscheidung bei statischer Polymorphie on Sat, 01 Oct 2011 11:58:32 GMT]]></title><description><![CDATA[<p>An das Posting kann ich mich gut erinnern, verwende ich auch ab und zu,<br />
allerdings nur, wenn ich kein Objekt zur Verfügung habe.</p>
<p>In dem 'Déjà-vu'-Posting habe ich ja nur einen typedef...</p>
<p>EDIT:<br />
Und es macht natürlich Sinn, wenn man nur dieses Objekt separat behandeln möchte und keine abgeleiteten Klassen...<br />
Ein Anwendungsfall fällt mir im Moment nicht ein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125804</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 01 Oct 2011 11:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to Typ-Unterscheidung bei statischer Polymorphie on Sat, 01 Oct 2011 12:52:01 GMT]]></title><description><![CDATA[<p>In deinem Beispiel spielt doch auch nur der Typ eine Rolle, du hast ja keine Parametervariablen.</p>
<p>Und ob du <code>void*</code> oder <code>T</code> nimmst, hängt vor allem davon ab, ob du die Typinformation brauchst und ob du Objekte/Referenzen oder Zeiger übergibst. Wobei du natürlich auch <code>T*</code> nehmen kannst. Bei <code>void*</code> sind keine separaten Instanziierungen notwendig, tendenziell ist der erzeugte Code also kleiner. Andererseits kannst du mit <code>void*</code> genauer steuern, was alles zur Überladungsauflösung genommen wird – ein</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void Func(T&amp; t);
</code></pre>
<p>wird für ziemlich viele Aufrufe ausgewählt, wenn kein besserer Match vorliegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125823</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 Oct 2011 12:52:01 GMT</pubDate></item><item><title><![CDATA[Reply to Typ-Unterscheidung bei statischer Polymorphie on Sat, 01 Oct 2011 14:36:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>In deinem Beispiel spielt doch auch nur der Typ eine Rolle, du hast ja keine Parametervariablen.</p>
</blockquote>
<p>Hast du allerdings recht...<br />
Ich wollte das Beispiel nur ziemlich kurz halten und hab deswegen mit dem int nichts mehr gemacht...</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Bei void* sind keine separaten Instanziierungen notwendig, tendenziell ist der erzeugte Code also kleiner.</p>
</blockquote>
<p>Würde ein halbwegs intelligenter Compiler nicht inlinen und somit gegen nichts ersetzen?</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Andererseits kannst du mit void* genauer steuern, was alles zur Überladungsauflösung genommen wird</p>
</blockquote>
<p>Inwiefern &quot;genauer steuern&quot;? Also ein Zeiger ist er ja wegen des &amp; immer und greift doch genau wenn das Funktions-Template auch greift, odeR?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125858</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 01 Oct 2011 14:36:06 GMT</pubDate></item><item><title><![CDATA[Reply to Typ-Unterscheidung bei statischer Polymorphie on Sun, 02 Oct 2011 01:27:39 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Würde ein halbwegs intelligenter Compiler nicht inlinen und somit gegen nichts ersetzen?</p>
</blockquote>
<p>Bei Inlining hast du nicht nichts, sondern sogar <em>mehr</em> Assemblercode, weil dieser bei jedem Funktionsaufruf dupliziert wird.</p>
<p>XSpille schrieb:</p>
<blockquote>
<p>Inwiefern &quot;genauer steuern&quot;? Also ein Zeiger ist er ja wegen des &amp; immer und greift doch genau wenn das Funktions-Template auch greift, odeR?</p>
</blockquote>
<p>Nein:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Base {};
struct Derived : Base {};

template &lt;typename T&gt;
void X(T* t)     { std::cout &lt;&lt; &quot;T*&quot; &lt;&lt; std::endl; }
void X(Base* t)  { std::cout &lt;&lt; &quot;Base*&quot; &lt;&lt; std::endl; }

void Y(void* t)  { std::cout &lt;&lt; &quot;void*&quot; &lt;&lt; std::endl; }
void Y(Base* t)  { std::cout &lt;&lt; &quot;Base*&quot; &lt;&lt; std::endl; }

int main()
{
	Derived d;
	X(&amp;d);     // T*
	Y(&amp;d);     // Base*
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2126049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126049</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 02 Oct 2011 01:27:39 GMT</pubDate></item></channel></rss>