<?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[Templatespezialisierung vs. Überladene Funktion]]></title><description><![CDATA[<p>Hallo, was ist besser?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; void doSomething(T a) {};

//Variante 1
void doSomething(int a) {}; //Einfache Überladung

//Variante 2
template&lt;&gt; void doSomething(int a){}; //Template-Spezialisierung
</code></pre>
<p>Welche Vorteile/Nachteile bieten die beiden Varianten? Was ist die übliche Variante? Was benutzt ihr?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246296/templatespezialisierung-vs-überladene-funktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 15:34:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246296.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Jul 2009 21:53:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sat, 25 Jul 2009 21:53:22 GMT]]></title><description><![CDATA[<p>Hallo, was ist besser?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; void doSomething(T a) {};

//Variante 1
void doSomething(int a) {}; //Einfache Überladung

//Variante 2
template&lt;&gt; void doSomething(int a){}; //Template-Spezialisierung
</code></pre>
<p>Welche Vorteile/Nachteile bieten die beiden Varianten? Was ist die übliche Variante? Was benutzt ihr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749632</guid><dc:creator><![CDATA[Emberlei]]></dc:creator><pubDate>Sat, 25 Jul 2009 21:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 00:37:53 GMT]]></title><description><![CDATA[<p>Hm, das ist ein seltsamer Ansatz. Die beiden Varianten sind nicht alternativ.</p>
<p>Eine Spezialisierung fügst du ja hinzu, falls dein allgemeines Template für gewisse Datentypen ein anderes Verhalten zeigen soll. Du darfst auch nicht vergessen, dass trotz Definition einer normalen Funktion zusätzlich zum Template, das Template immer noch durch explizite Angabe der Datentypen direkt aufrufbar ist.</p>
<p>Eine normale Funktion zusätzlich zum Template macht Sinn, wenn laut Argumentdeduktion fehlerhafte Aufrufe, d.h. solche zu denen keine Template-Instanz erzeugt werden kann, in der normalen Funktion aufgefangen werden sollen.</p>
<p>Man kann daher in meinen Augen nicht von besser/schlechter usw. sprechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749660</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 26 Jul 2009 00:37:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 03:36:46 GMT]]></title><description><![CDATA[<p>Ich würde grundsätzlich einen Overload vorziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749669</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 26 Jul 2009 03:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 08:10:16 GMT]]></title><description><![CDATA[<p>Unbedingt den Overload vorziehen:<br />
<a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749689</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 26 Jul 2009 08:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 10:21:53 GMT]]></title><description><![CDATA[<p><strong>@hustbear, theta</strong><br />
Könnte ihr das nochmal näher begründen?</p>
<p>Ich weiß nicht, der Artikel hat in meinen Augen nicht sonderlich viel Qualität. Warum soll es nicht intuitiv sein, dass zuerst das Template ausgewählt wird und danach erst die jeweiligen Spezialisierungen berücksichtigt werden?</p>
<p>Wenn ich jetzt z.B. hergehe und meinem Template statt einer Spezialisierung eine normale Funktion verpasse, dann ist es ja auch mit der Template-Überladung für diesen Datentyp vorbei. Besonders intuitiv ist das auch nicht.</p>
<pre><code class="language-cpp">template&lt;class T&gt;     // mein Template
void f( T );

//template&lt;&gt;            // Spezialisierung, nehme ich nicht
//void f&lt;&gt;(int*);

void f(int*);        // stattdessen eine normale Funktion

template&lt;class T&gt;    // obwohl ich nun das Template für Zeiger überlade  
void f( T* );        // bleibt es beim alten Verhalten im Fall int*
</code></pre>
<p>Macht auch nicht gerade viel Sinn. Jedenfalls bräuchten in meinen Augen die von euch verwendeten Begriffe***&quot;grundsätzlich Overload&quot;*** und <em><strong>&quot;unbedingt Overload&quot;</strong></em> nochmal eine Begründung, vielleicht wird es dann klarer.</p>
<p>Der Threadstarter hat ja schließlich auch nach Vor- und Nachteilen gefragt. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749720</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 26 Jul 2009 10:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 10:39:27 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26247">@Mitleid</a>,</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void foo(T)
{
  std::cout &lt;&lt; &quot;T&quot; &lt;&lt; std::endl;
}

template&lt;&gt;
void foo(int*) // Gilt als Spezialisierung von template&lt;typename T&gt; void foo(T);
{
  std::cout &lt;&lt; &quot;int*&quot; &lt;&lt; std::endl;
}

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

// ...

int* p = 0;
foo(p); // gibt T* aus, da das Template T* besser ist als das Template T.
// Ich wollte aber die Spezialisierung haben, die wurde allerdings nicht gefunden,
// da sie zum Template T gehört.

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

void foo(int*) // Keine Spezialisierung, sondern Überladung.
{
  std::cout &lt;&lt; &quot;int*&quot; &lt;&lt; std::endl;
}

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

// ...

int* p = 0;
foo(p); // Gibt wie gewünscht int* aus. Funktionen werden Funktionstemplates bevorzugt.
</code></pre>
<p>Das grosse Problem hier ist also, worauf sich die Spezialisierung bezieht. Eine Überladung gilt für alle Funktionen, eine Spezialisierungen immer nur explizit auf ein Funktionstemplate davor.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749730</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 26 Jul 2009 10:39:27 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 10:55:37 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int* p = 0;
foo(p); // gibt T* aus, da das Template T* besser ist als das Template T.
// Ich wollte aber die Spezialisierung haben, die wurde allerdings nicht gefunden,
// da sie zum Template T gehört.
</code></pre>
</blockquote>
<p>Das sehe ich etwas anders. Warum sollte man intuitiv die Spezialisierung erwarten?</p>
<p>Ich würde eher intuitiv das für Zeigertypen überladene Template erwarten. Besonders wenn das erste Template nicht von mir stammt und ich mein eigenes für Zeigertypen selbst hinzugefügt hätte.</p>
<p>Macht doch viel mehr Sinn, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749734</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 26 Jul 2009 10:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 11:07:36 GMT]]></title><description><![CDATA[<p>Mitleid schrieb:</p>
<blockquote>
<p>Macht doch viel mehr Sinn, oder nicht?</p>
</blockquote>
<p>In meiner Logik überhaupt nicht. C++ nimmt normalerweise immer die Funktion, welche am besten passt. Du hast eine Funktion, welche explzit einen <code>int*</code> nimmt, besser also gar nicht passen kann, aber sie wird nicht genommen. Sowas halte ich für sehr seltsam.</p>
<p>Auch dein Beispiel ist etwas an den Haaren herbeigezogen. Es kann natürlich schon sein, dass man eine Spezialisierung möchte und keine Überladung, aber das kommt meiner Meinung nach eher sehr selten vor. Habe ich persönlich jedenfalls noch nicht ein einziges Mal erlebt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749738</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 26 Jul 2009 11:07:36 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 11:33:49 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Du hast eine Funktion, welche explzit einen <code>int*</code> nimmt, besser also gar nicht passen kann, aber sie wird nicht genommen. Sowas halte ich für sehr seltsam.</p>
</blockquote>
<p>Moment, mit einer Spezialisierung hast du keine Funktion die ein int* nimmt sondern einen Sonderfall, für den das allgemein gehaltene Template ungeeignet ist.</p>
<p>Wenn ich das Template für bestimmte Datentypen überladen will, dann erwarte ich selbstverständlich, dass zu einem Aufruf das spezialisierteste Template genommen wird und nicht der Sonderfall eines weniger spezialisierten Templates.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Auch dein Beispiel ist etwas an den Haaren herbeigezogen. Es kann natürlich schon sein, dass man eine Spezialisierung möchte und keine Überladung, aber das kommt meiner Meinung nach eher sehr selten vor. Habe ich persönlich jedenfalls noch nicht ein einziges Mal erlebt.</p>
</blockquote>
<p><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=":confused:"
      alt="😕"
    /> Welches Beispiel? Was meinst du jetzt genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749744</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 26 Jul 2009 11:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 11:51:50 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Es kann natürlich schon sein, dass man eine Spezialisierung möchte und keine Überladung, aber das kommt meiner Meinung nach eher sehr selten vor. Habe ich persönlich jedenfalls noch nicht ein einziges Mal erlebt.</p>
</blockquote>
<p>Kann unter anderem Sinn machen, wenn man Template-Argumente explizit angibt. Also sowas wie:</p>
<pre><code class="language-cpp">std::string str;

int a = super_string_cast&lt;int&gt;(str);         // int wird mit allgemeinem Template behandelt
float b = super_string_cast&lt;float&gt;(str);     // ok, float ebenfalls
MyClass c = super_string_cast&lt;MyClass&gt;(str); // MyClass erfordert spezielle Behandlung, hier Spezialisierung
</code></pre>
<p>Aber da Funktionstemplates nicht partiell spezialisiert werden können, ist man in vielen Fällen ziemlich eingeschränkt. Zum Glück kann man mit Überladung trotzdem recht viel erreichen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749757</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 26 Jul 2009 11:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 13:27:27 GMT]]></title><description><![CDATA[<p>Mitleid schrieb:</p>
<blockquote>
<p>Moment, mit einer Spezialisierung hast du keine Funktion die ein int* nimmt sondern einen Sonderfall, für den das allgemein gehaltene Template ungeeignet ist.</p>
</blockquote>
<p>Ja, klar, das ist ja der Unterschied und dieser ist meiner Meinung nach nicht so logisch ersichtlich. Es ist nicht wirklich klar, für was die Spezialisierung gilt, da man sich in C++ und Funktionen stark am Namen orientiert. Dass sich diese Zugehörigkeit ganz unterschiedlich verhalten kann, wird auch schön im Artikel aufgezeigt, wo die Reihenfolge der Deklaration unterschiedlich ist. Es ist eben keine Überladung, obwohl man sowas durchaus erwarten könnte.<br />
Vor allem sollte man sich auch bewusst werden, dass die Überladung und Spezialisierung über mehrere Dateien verteilt sein kann. Da noch den Überblick zu behalten, was nun wohl eine Spezialisierung für welche Überladung sein wird, das dürfte eher schwer sein und der Übersicht nicht wirklich dienlich. Vor allem auch, weil man doch meistens die Überladung möchte, sonst nimmt man am besten gleich einen anderen Funktionsnamen.</p>
<p>Deshalb auch die Empfehlung, dass man die Überladung vorziehen sollte. Es steht nicht, dass man die Spezialisierung vergessen sollte <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>Mitleid schrieb:</p>
<blockquote>
<p><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=":confused:"
      alt="😕"
    /> Welches Beispiel? Was meinst du jetzt genau?</p>
</blockquote>
<p>-&gt;</p>
<p>Mitleid schrieb:</p>
<blockquote>
<p>Besonders wenn das erste Template nicht von mir stammt und ich mein eigenes für Zeigertypen selbst hinzugefügt hätte.</p>
</blockquote>
<p>Empfinde ich nicht wirklich als übliches Vorgehen. Meistens sind fremde Codes auch noch in einem eigenen Namensraum und in fremde Namensräume sollte man eher nichts reinsetzen. Für sowas sollte man besser eine explizite Trennung durchführen. Ich habe jedenfalls sowas noch nicht gesehen und kann mir auch kein praktisches Beispiel dazu ausdenken.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749799</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 26 Jul 2009 13:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 14:21:32 GMT]]></title><description><![CDATA[<p>Ich fürchte wir werden uns da nicht einig und das Problem ist praktisch auch mehr oder weniger bedeutungslos. Immerhin wurden ein paar Aspekte angeschnitten. <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="🙂"
    /> Ich hoffe das war im Sinne des Threadstarters.</p>
<p>Nebenbei wenn du nur eine normale Funktion hinzufügst kann ein eifriger Programmierer für seinen Aufruf trotzdem das Template instanziieren (siehe Beitrag Nexus)</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void foo(T)
{
  std::cout &lt;&lt; &quot;T&quot; &lt;&lt; std::endl;
}

void foo(int*) // Keine Spezialisierung, sondern Überladung.
{
  std::cout &lt;&lt; &quot;int*&quot; &lt;&lt; std::endl;
}

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

// ...

int* p = 0;
foo(p); // Gibt wie gewünscht int* aus. Funktionen werden Funktionstemplates bevorzugt. 

foo&lt;int*&gt;(p);  // Template behandelt den Fall falsch und *Puff*!
</code></pre>
<p>Um auch die Meinungsverschiedenheit unter den &quot;Kapazitäten&quot; zu verdeutlichen hier ein Zitat von Lippman aus dem Primer:</p>
<p><strong>Best Practices:</strong> <em>It is hard to design overloaded function sets involving both function templates and nontemplate functions. Because of the likelihood of surprise to users of the functions, it is almost always better to define a function-template specialization than to use a nontemplate version.</em></p>
<p>Aber gut, wie gesagt, das Problem ist von niedriger Bedeutung. Ich klinke mich fürs Erste aus und genieße noch etwas die Sonne. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749831</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 26 Jul 2009 14:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 21:01:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26247">@Mitleid</a>:<br />
Du solltest den hier verlinkten Artikel <a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a> nochmal lesen, denn du hast ihn offensichtlich nicht verstanden.<br />
Speziell:</p>
<pre><code class="language-cpp">// A class template
template&lt;class T&gt; class X { /*...*/ };      // (a)

// A function template with two overloads
template&lt;class T&gt; void f( T );              // (b)    &lt;------ DAS HIER -----
template&lt;class T&gt; void f( int, T, double ); // (c)

// ...

// Example 1, continued: Specializing templates 
//

// A partial specialization of (a) for pointer types 
template&lt;class T&gt; class X&lt;T*&gt; { /*...*/ };

// A full specialization of (a) for int 
template&lt;&gt; class X&lt;int&gt; { /*...*/ };

// A separate base template that overloads (b) and (c) 
// -- NOT a partial specialization of (b), because 
// there's no such thing as a partial specialization 
// of a function template! 
template&lt;class T&gt; void f( T* );             // (d)   &lt;------ UND DAS HIER -----

// A full specialization of (b) for int 
template&lt;&gt; void f&lt;int&gt;( int );              // (e)

// A plain old function that happens to overload with 
// (b), (c), and (d) -- but not (e), which we'll 
// discuss in a moment 
void f( double );                           // (f)
</code></pre>
<p>(d) ist KEINE Spezialisierung!</p>
<p>Und: wieso sollte man hier nochmals alles erklären, was in dem Artikel wunderbar beschrieben steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1750004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1750004</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 26 Jul 2009 21:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Sun, 26 Jul 2009 22:18:47 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26247">@Mitleid</a>:<br />
Du solltest den hier verlinkten Artikel <a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a> nochmal lesen, denn du hast ihn offensichtlich nicht verstanden.</p>
</blockquote>
<p>Offensichtlich ist nur, dass du froh bist von theta den Artikel verlinkt bekommen zu haben, denn sonst hättest du keine Argumente für deine Behauptung <em><strong>&quot;grundsätzlich Overload&quot;</strong></em> vorbringen können.</p>
<p>Ich bilde mir ein den Artikel verstanden zu haben (er ist ja auch recht leicht zu verstehen), bin aber mit den dort vertretenen Meinungen nicht 100%ig einverstanden. Die Semantik der Sprache ist nun mal wie sie ist, deshalb finde ich es übertrieben etwas wie</p>
<p><em>Moral #1: If you want to customize a function base template and want that customization to participate in overload resolution (or, to always be used in the case of exact match), make it a plain old function, not a specialization. And, if you do provide overloads, avoid also providing specializations.</em></p>
<p>zu empfehlen, nur weil man angeblich intuitiv eine andere Semantik erwartet.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>(d) ist KEINE Spezialisierung!</p>
</blockquote>
<p>Danke für die deutliche Klarstellung, ich glaube aber das war mir und allen die hier mitdiskutieren bereits klar. <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>Wenn dich mein Satz <em>&quot;...dass zu einem Aufruf das spezialisierteste Template...&quot;</em> zu der irrigen Ansicht gebracht, dann stelle ich nochmal klar, dass das spezialisierteste Template bei der Argumentdeduktion gemeint war.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Und: wieso sollte man hier nochmals alles erklären, was in dem Artikel wunderbar beschrieben steht?</p>
</blockquote>
<p>Nun ich nahm an, wenn du sagst, dass man GRUNDSÄTZLICH mit einer normalen Funktion überladen sollte, dann hast du auch ein paar gute Argumente dafür.</p>
<p>Was in dem Artikel gesagt wird ist schön und gut, nur, wie bereits aufgeführt, sind andere Autoren auch gegensätzlicher Meinung. Es scheint also nicht ganz so eindeutig zu sein.</p>
<p>Und was du mit einem Aufruf wie</p>
<pre><code class="language-cpp">int* p = 0;
f&lt;int*&gt;(p);
</code></pre>
<p>in deiner Variante machen willst, hast du auch noch nicht verraten.</p>
<p>Wie oben bereits erwähnt ist das Problem in meinen Augen eher nebensächlich. Ich würde die Wahl als Geschmackssache abtun. Aber, den Quelltext gut kommentieren, für Leute die eine andere Intuition haben. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1750021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1750021</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 26 Jul 2009 22:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Mon, 27 Jul 2009 13:06:36 GMT]]></title><description><![CDATA[<p>Mitleid schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26247">@Mitleid</a>:<br />
Du solltest den hier verlinkten Artikel <a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a> nochmal lesen, denn du hast ihn offensichtlich nicht verstanden.</p>
</blockquote>
<p>Offensichtlich ist nur, dass du froh bist von theta den Artikel verlinkt bekommen zu haben, denn sonst hättest du keine Argumente für deine Behauptung <em><strong>&quot;grundsätzlich Overload&quot;</strong></em> vorbringen können.</p>
</blockquote>
<p>Ich kannte genau diesen Artikel schon, war nur zu faul mir den Link wieder rauszusuchen.</p>
<p>Mitleid schrieb:</p>
<blockquote>
<p>Und was du mit einem Aufruf wie</p>
<pre><code class="language-cpp">int* p = 0;
f&lt;int*&gt;(p);
</code></pre>
<p>in deiner Variante machen willst, hast du auch noch nicht verraten.</p>
</blockquote>
<p>Ich will in &quot;meiner&quot; Variante garnix damit machen, weil das IMO Mist ist. Bei einem Funktionstemplate Template-Argumente mitzugeben, wenn diese deduziert werden können, ist IMO so unsauber, dass man darauf keinerlei Rücksicht nehmen muss.</p>
<p>BTW: bist du dir darüber im Klaren, dass bei deiner Variante hier das Template &quot;template&lt;typename T&gt; void foo(T)&quot; aufgerufen wird, und NICHT &quot;template&lt;typename T&gt; void foo(T*)&quot;? Und genau sowas halte ich für total kontraintuitiv.</p>
<p>----</p>
<p>IMO gibt es nur zwei sinnvolle Varianten, da dabei keine Überraschungen entstehen.</p>
<ol>
<li>nur Overloads, keine einzige Spezialisierung</li>
<li>nur ein einziges Template, welches an eine statische Non-Template Member-Funktion einer Template Klasse weiterleitet, und dann die Template-Klasse (u.u. auch partiell) spezialisieren</li>
</ol>
<p>Möglichkeit 3), nämlich nur Spezialisierungen halte ich <em>im Allgemeinen</em> nicht für gut, da man Funktions-Templates eben nicht partiell spezialisieren kann.</p>
<p>Und Möglichkeit 4), nämlich Spezialisierungen + Overloads dort wo partielle Spezialisierungen nötig wären, halte ich für eine Katastrophe schlechthin, da dann wirklich Dinge passieren, die man sich nicht erwartet.</p>
<p>----</p>
<p>Es gibt allerdings einige Spezialfälle, in denen &quot;nur Spezialisierungen&quot; Sinn machen können. Nämlich z.B. dann, wenn man eine Funktion für bestimmte Typen &quot;erlauben&quot; will, und gleichzeitig implizite Konvertierungen verbieten.<br />
Beispiel:</p>
<pre><code class="language-cpp">template &lt;class T&gt; void foo(T const&amp;);

template &lt;&gt; void foo(int const&amp;) {}
template &lt;&gt; void foo(double const&amp;) {}

void test()
{
   foo(1); // geht, int
   foo(1.0); // geht auch, double

   foo(1.0f); // geht nicht, float
   foo(1L); // geht nicht, long
   foo(1U); // geht nicht, unsigned int
   // ...
}
</code></pre>
<p>----</p>
<p>p.S.: noch ein lustiges Beispiel dafür, wieso Funktions-Template-Spezialisierungen böse sind:</p>
<pre><code class="language-cpp">template &lt;class T&gt; void Foo(T)
{
    printf(&quot;primary template, T = %s\n&quot;, typeid(T).name());
}

template &lt;&gt; void Foo(int const*)
{
	printf(&quot;specialization int const*\n&quot;);
}

int _tmain(int argc, _TCHAR* argv[])
{
	Foo(static_cast&lt;char const*&gt;(0));

	int i = 0;
	Foo(&amp;i); // OOPS!

	int const ic = 0;
	Foo(&amp;ic);

	return 0;
}

// Output:
/*
primary template, T = char const *
primary template, T = int *
specialization int const*
*/
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1750274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1750274</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 27 Jul 2009 13:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung vs. Überladene Funktion on Mon, 27 Jul 2009 16:27:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich will in &quot;meiner&quot; Variante garnix damit machen, weil das IMO Mist ist. Bei einem Funktionstemplate Template-Argumente mitzugeben, wenn diese deduziert werden können, ist IMO so unsauber, dass man darauf keinerlei Rücksicht nehmen muss.</p>
</blockquote>
<p>Der Punkt ist doch, dass das korrektes C++ ist. Dem Aufrufer ist doch egal welches f() dann letztlich das Ergebnis liefert, er erwartet aber, dass es sinnvoll ist. Du als Entwickler hast aber keine Chance solch einen Aufruf mit deiner normalen überladenen Funktion abzufangen.</p>
<p>Man kann auch ein Beispiele konstruieren, in welchen dir solche Aufrufe natürlicher vorkommen bzw. unabdingbar sind:</p>
<pre><code class="language-cpp">template&lt;class T1, class T2&gt;          
T1 f( T2 myT2)
{
	return T1();
}

template&lt;class T1, class T2&gt;         
T1 f( T2 *myT2)               
{
	return T1();
}
//...
   int i;
   int *pi1 = f&lt;int*&gt;(i);
   int *pi2 = f&lt;int*&gt;(&amp;i);
</code></pre>
<p>hustbaer schrieb:</p>
<blockquote>
<p>BTW: bist du dir darüber im Klaren, dass bei deiner Variante hier das Template &quot;template&lt;typename T&gt; void foo(T)&quot; aufgerufen wird, und NICHT &quot;template&lt;typename T&gt; void foo(T*)&quot;?</p>
</blockquote>
<p>Wo mit einer Spezialisierung reagiert werden kann, während einem ohne Spezialisierung der Fall durch die Finger rutscht.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Und genau sowas halte ich für total kontraintuitiv.</p>
</blockquote>
<p>Da gebe ich dir Recht, das hat aber in diesem Fall nichts mit Templatespezialisierung vs. Überladene Funktion zu tun. Da hätte man auch ohne Spezialisierung/Funktion intuitiv etwas anderes erwartet.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>1)...<br />
2)...<br />
3)...<br />
4)...</p>
</blockquote>
<p>Ich würde sagen, man soll versuchen den Entwurf einfach zu halten, denn egal wie du es letztlich auch machst, wenn es komplizierter wird mit Überladung oder Spezialisierung, mehreren Parametern usw. wird dir kaum einer ad hoc intuitiv sagen können was für einen bestimmten Aufruf genau passiert.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>p.S.: noch ein lustiges Beispiel dafür, wieso Funktions-Template-Spezialisierungen böse sind:</p>
</blockquote>
<p>Sind sie wirklich böse, oder hättest du es nur anders erwartet?</p>
<p>So, für mich war es das. <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="🙂"
    /> Ich finde wir sind sowieso schon zu lange auf dieser Nebensächlichkeit herumgeritten. Daher fällt es mir auch nicht schwer deine Meinung zu akzeptieren. Meinetwegen. Wenn also jemand in diesen Abwägungsprozess kommt kann er sich auch GRUNDSÄZTLICH für Überladung mit einer normalen Funktion entscheiden. Es ist ja kein Schuss ins Knie ... <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1750398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1750398</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Mon, 27 Jul 2009 16:27:04 GMT</pubDate></item></channel></rss>