<?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[Bedingungen und Template-Parameter]]></title><description><![CDATA[<p>Hallo</p>
<p>Weshalb bekomme ich keine Kompilerwarnung innerhalb von <strong>foo2()</strong> aber innerhalb von <strong>foo1()</strong> ? Beide bedingte Ausdrücke sind doch zur Laufzeit konstant?</p>
<p>Was ist der Unterschied zwischen einer <strong>if</strong>-Bedingung und dem <strong>?</strong>-Operator? Wird das vom Compiler unterschiedlich übersetzt? Wie gehe ich vor, wenn ich mehrere Template-Parameter habe und diese mit Bedingungen zur Compilerzeit überprüfen muss?</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;  // printf()

template&lt;bool a&gt;
char foo1() {
  if (a)           // MS-VC2008 Warnung: &quot;Bedingter Ausdruck ist konstant&quot;
    return '1';
  else
    return '0';
}

template&lt;bool a&gt;
char foo2() {
  return a ? '1' : '0';
}

int main() {
  printf(&quot;%c\n&quot;, foo1&lt;1&gt;());
  printf(&quot;%c\n&quot;, foo2&lt;1&gt;());
  return 0;
}
</code></pre>
<p>Gruss<br />
T.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272868/bedingungen-und-template-parameter</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 15:44:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272868.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Aug 2010 15:14:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bedingungen und Template-Parameter on Thu, 26 Aug 2010 15:15:41 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Weshalb bekomme ich keine Kompilerwarnung innerhalb von <strong>foo2()</strong> aber innerhalb von <strong>foo1()</strong> ? Beide bedingte Ausdrücke sind doch zur Laufzeit konstant?</p>
<p>Was ist der Unterschied zwischen einer <strong>if</strong>-Bedingung und dem <strong>?</strong>-Operator? Wird das vom Compiler unterschiedlich übersetzt? Wie gehe ich vor, wenn ich mehrere Template-Parameter habe und diese mit Bedingungen zur Compilerzeit überprüfen muss?</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;  // printf()

template&lt;bool a&gt;
char foo1() {
  if (a)           // MS-VC2008 Warnung: &quot;Bedingter Ausdruck ist konstant&quot;
    return '1';
  else
    return '0';
}

template&lt;bool a&gt;
char foo2() {
  return a ? '1' : '0';
}

int main() {
  printf(&quot;%c\n&quot;, foo1&lt;1&gt;());
  printf(&quot;%c\n&quot;, foo2&lt;1&gt;());
  return 0;
}
</code></pre>
<p>Gruss<br />
T.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944686</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 26 Aug 2010 15:15:41 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingungen und Template-Parameter on Thu, 26 Aug 2010 16:27:52 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Beide Arten bewirken das gleiche, aber so sind die Compiler. Probiere einen anderen und er wird dir andere Warnungen generieren.</p>
<p>Aber einfach gesagt: Bei templates spezialisiert man (statisch), während das Aus-if-en eigentlich zur Laufzeit änderbare Variablen bedient.<br />
Ein gutes Stichwort für dich ist Template Specialization bzw. Partial Template Specialization</p>
<p>Probier mal</p>
<pre><code class="language-cpp">template&lt;bool a&gt; char foo1();

template&lt;&gt; char foo1&lt;true&gt;()  { return '1'; }
template&lt;&gt; char foo1&lt;false&gt;() { return '0'; }
</code></pre>
<p>oder noch besser:</p>
<pre><code class="language-cpp">template&lt;bool a&gt; struct foo;
template&lt;&gt; struct foo&lt;true&gt;  { static const char value = '1'; };
template&lt;&gt; struct foo&lt;false&gt; { static const char value = '0'; };
...
char chr1 = foo&lt;true&gt;::value;
char chr2 = foo&lt;false&gt;::value;
</code></pre>
<p>Theoretisch entstehen bei deinem Code zwei Funktion:</p>
<pre><code class="language-cpp">char foo1&lt;true&gt;() { if (true) return '1'; else return '0'; }
char foo1&lt;false&gt;() { if (false) return '1'; else return '0'; }
</code></pre>
<p>Jeder gute Compiler wird das ohnehin weg-optimieren, aber in beiden Fällen sollte der Compiler fragen wieso du ihm eine solche if/?-Bedingung überhaupt angibst.</p>
<p>lg XOR <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1944717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944717</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Thu, 26 Aug 2010 16:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingungen und Template-Parameter on Thu, 26 Aug 2010 16:31:07 GMT]]></title><description><![CDATA[<p>In diesem struct-Fall geht's sogar einfacher. Das erklärt vielleicht auch, warum bei Anwendung des ?: Operators keine Warnung kommt.</p>
<pre><code class="language-cpp">template&lt;bool a&gt; struct foo { static char const value = a ? '0' : '1'; }
</code></pre>
<p>Mit if wird das nix <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1944718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944718</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 26 Aug 2010 16:31:07 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingungen und Template-Parameter on Thu, 26 Aug 2010 16:55:14 GMT]]></title><description><![CDATA[<p>Der ? Operator ist ja auch ein wichtiges Mittel der Templatemetaprogrammierung. Wäre ziemlich nervig wenn da dauernd gewarnt würde. Denn der ?-Operator kann in diesem Fall mitsamt Ergebnis zur Compilezeit ausgewertet werden, während if auch immer noch eine gewisse Laufzeitkomponente braucht. Zumindest für das Ergebnis, auch wenn die eigentliche Bedingung eventuell wegoptimiert werden kann. Und die Optimierung findet in der Regel ja auch erst nach dem Compilieren statt, das heißt ? kann hier sofort weggekürzt werden, if erst später. Und deshalb wird es bei if eben die Warnung geben, während von dem ? gar nichts mehr übrig bleibt.</p>
<p>Ich hoffe das war jetzt nicht zu wirr erklärt <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="😃"
    /> . <strong>Zusammenfassung</strong>: Ja, es gibt einen Unterschied im Compiler zwischen ? und if.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944721</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 26 Aug 2010 16:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingungen und Template-Parameter on Thu, 26 Aug 2010 17:37:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a> &amp; SeppJ: Ja, da habt ihr Recht. ? hat wirklich eine spezielle Rolle (Nur bei einem gewöhnlichen x = cond() ? func1() : func2() ist ein if gleichwertig )</p>
<p>Die Compiler sind hier dennoch unterschiedlich bei den Warnungen. Hatte erst kürzlich wieder eine if(false) - Pseudo-Auskommentierung, die der MSVC ignoriert, während der GCC davor warnt. <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/1944742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944742</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Thu, 26 Aug 2010 17:37:17 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingungen und Template-Parameter on Fri, 27 Aug 2010 06:10:04 GMT]]></title><description><![CDATA[<p>Danke für die Erklärungen!</p>
<p>T.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944866</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Fri, 27 Aug 2010 06:10:04 GMT</pubDate></item></channel></rss>