<?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[Implizite Template Instanzierung]]></title><description><![CDATA[<p>Gibt es so etwas wie eine <em>Implizite Template Instanzierung</em>. Nachfolgendes Beispiel lässt sich anstandslos compilieren. Obwohl es das nicht sollte, solange keine explicite Instanzierung des Postincrement Operators für den Typ <strong>Test</strong> gemacht ist.</p>
<pre><code>template&lt;typename T&gt;
inline T operator++(T&amp; t, int) {
  t = static_cast&lt;T&gt;(static_cast&lt;int&gt;(t) + 1);
  return t;
}

enum Test {
  A0, A1, A2
};

Test Foo(Test t) {
  t++;  // Wird hier ein überladener Operator vom Compiler gebaut?
  return t;
}
</code></pre>
<p>Was geht hier vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321910/implizite-template-instanzierung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 15:46:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321910.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Nov 2013 17:23:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 17:24:01 GMT]]></title><description><![CDATA[<p>Gibt es so etwas wie eine <em>Implizite Template Instanzierung</em>. Nachfolgendes Beispiel lässt sich anstandslos compilieren. Obwohl es das nicht sollte, solange keine explicite Instanzierung des Postincrement Operators für den Typ <strong>Test</strong> gemacht ist.</p>
<pre><code>template&lt;typename T&gt;
inline T operator++(T&amp; t, int) {
  t = static_cast&lt;T&gt;(static_cast&lt;int&gt;(t) + 1);
  return t;
}

enum Test {
  A0, A1, A2
};

Test Foo(Test t) {
  t++;  // Wird hier ein überladener Operator vom Compiler gebaut?
  return t;
}
</code></pre>
<p>Was geht hier vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368700</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 17:25:58 GMT]]></title><description><![CDATA[<p>Das ist immer so bei Funktionen.<br />
Der Compiler kann anhand der übergebenen Argumente Rückschlüsse auf die Typen ziehen.<br />
Das nennt sich template argument deduction.<br />
Sei froh drüber, die Alternative säh nicht schön aus:<br />
operator++&lt;Test&gt;(t, 0);</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368701</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 17:32:58 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Das ist immer so bei Funktionen.<br />
Der Compiler kann anhand der übergebenen Argumente Rückschlüsse auf die Typen ziehen.<br />
Das nennt sich template argument deduction.<br />
Sei froh drüber, die Alternative säh nicht schön aus:<br />
operator++&lt;Test&gt;(t, 0);</p>
</blockquote>
<p>Wenn das zum Standard gehört und keine Eigenheit des MS Compilers ist, dann wäre das sehr nett!</p>
<p>Das heißt aber auch, dass ich keine Kontrolle mehr über die verwendeten Operatoren meiner neuen Typen habe, wenn der Compiler ein entsprechendes Template findet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368702</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:32:58 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 17:34:35 GMT]]></title><description><![CDATA[<p>Man überlädt auch keine Operatoren als Templates im globalen Namensraum. Sonst muss man sich nicht wundern, wenn der Compiler versucht, diese zu verwenden...</p>
<p>Was hast du genau vor? Willst du mit möglichst wenig Schreibaufwand neue Operatoren für Enums definieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368703</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 17:45:59 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Man überlädt auch keine Operatoren als Templates im globalen Namensraum. Sonst muss man sich nicht wundern, wenn der Compiler versucht, diese zu verwenden...</p>
<p>Was hast du genau vor? Willst du mit möglichst wenig Schreibaufwand neue Operatoren für Enums definieren?</p>
</blockquote>
<p>Naheliegend wäre Folgendes:</p>
<pre><code>#include &quot;all_overloaded_operators.h&quot;

enum File {};
enum Rank {};
enum Square {};
</code></pre>
<p>Und anschließend kann ich mit den &quot;neu&quot; definierten Typen rechnen wie mit Integers und man hat noch eine Typüberwachung:</p>
<pre><code>void Foo1(int, int, int);  // :-(
void Foo2(File, Rank, Square);  // :-)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2368705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368705</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:45:59 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 18:23:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Gibt es so etwas wie eine Implizite Template Instanzierung. Nachfolgendes Beispiel lässt sich anstandslos compilieren. Obwohl es das nicht sollte, solange keine explicite Instanzierung des Postincrement Operators für den Typ Test gemacht ist.</p>
</blockquote>
<p>Das musst du vertauschen. Funktionstemplates werden implizit instantiiert, sobald sie von der Overload-Resolution ausgewählt werden.</p>
<p>Es gibt auch explizite Instantiierung, aber das bezeichnet folgendes:</p>
<pre><code>template&lt;typename T&gt;
inline T operator++(T&amp; t, int) {
  t = static_cast&lt;T&gt;(static_cast&lt;int&gt;(t) + 1);
  return t;
}

enum Test {
  A0, A1, A2
};

template Test operator++&lt;Test&gt;(Test&amp;, int); // Explizite Instantiierungs-Definition
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2368713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368713</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 18:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 18:24:59 GMT]]></title><description><![CDATA[<p>Wie wäre es damit:</p>
<pre><code>template &lt;typename T&gt;
        struct EnableOperator : public std::false_type
        {
        };

        template &lt;typename T, typename ReturnType&gt;
        using Enable = std::enable_if&lt;EnableOperator&lt;T&gt;::value, ReturnType&gt;;

template &lt;typename T&gt;
typename Enable&lt;T, T&gt; operator ++ (T&amp; t) noexcept
{
    t = static_cast&lt;T&gt;(static_cast&lt;int&gt;(t) + 1);
    return t;
}
</code></pre>
<p>Dann kannst du mit</p>
<pre><code>template &lt;&gt;
        struct EnableOperator&lt;DeinTyp&gt; : public std::true_type { };
</code></pre>
<p>die operatoren für diesen Typ aktivieren, sie sind aber standardmäßig deaktiviert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368714</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Thu, 28 Nov 2013 18:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 18:35:22 GMT]]></title><description><![CDATA[<p>Das Problem mit den Enums hattest du doch schon <a href="http://www.c-plusplus.net/forum/254740-full" rel="nofollow">vor vier Jahren</a>...? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>..und auch wieder <a href="http://www.c-plusplus.net/forum/321541-full" rel="nofollow">vor 2 Wochen</a>. Was passt dir an den vorgeschlagenen Lösungen nicht? Das sauberste ist nach wie vor, eigene Klassentypen zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368716</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 28 Nov 2013 18:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Template Instanzierung on Thu, 28 Nov 2013 18:40:22 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das Problem mit den Enums hattest du doch schon <a href="http://www.c-plusplus.net/forum/254740-full" rel="nofollow">vor vier Jahren</a>...? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Und <a href="http://www.c-plusplus.net/forum/viewtopic.php?p=1806722" rel="nofollow">schon in ähnlicher Form 9 Tage davor</a>. Das macht ihn aber alles nicht satt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368718</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 18:40:22 GMT</pubDate></item></channel></rss>