<?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[templatemetaprogrammierung - Wikipediabeispiel, wozu der innere ternäre Operator?]]></title><description><![CDATA[<p>Hi,<br />
Bei Wikipedia gibt es zur Templatemetaprogrammierung folgendes Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

 template&lt;long B, unsigned long E&gt;
 struct pow_helper {
   static long const value = B * pow_helper&lt;B, E - 1&gt;::value;
 };

 template&lt;long B&gt;
 struct pow_helper&lt;B, 0&gt; {
   static long const value = 1;
 };

 template&lt;long B, long E&gt;
 struct power {
    static double const value;
 };

 template&lt;long B, long E&gt;
 double const power&lt;B, E&gt;::value= E &lt; 0 ? 1.0 / pow_helper&lt;B, E &lt; 0 ? -E : 0&gt;::value
                                        : pow_helper&lt;B, E &lt; 0 ? 0 : E&gt;::value;

 int main() {
   std::cout &lt;&lt; power&lt;10, -3&gt;::value &lt;&lt; std::endl;
 }
</code></pre>
<p>an dieser Stelle</p>
<pre><code class="language-cpp">pow_helper&lt;B, E &lt; 0 ? -E : 0&gt;
</code></pre>
<p>verstehe ich nicht was der ternäre Operator soll, da dieses Template doch sowieso nur &quot;ausgeführt&quot; wird wenn E &lt; 0.<br />
Ich habs getestet, ohne funktioniert es auch nicht, also hab ich irgendwo einen Denkfehler, in meinem Gedankenmodell funktionierts auch ohne, also:<br />
wozu ist die Abfrage da?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218227/templatemetaprogrammierung-wikipediabeispiel-wozu-der-innere-ternäre-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 19:35:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218227.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Jul 2008 15:32:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to templatemetaprogrammierung - Wikipediabeispiel, wozu der innere ternäre Operator? on Thu, 17 Jul 2008 15:32:30 GMT]]></title><description><![CDATA[<p>Hi,<br />
Bei Wikipedia gibt es zur Templatemetaprogrammierung folgendes Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

 template&lt;long B, unsigned long E&gt;
 struct pow_helper {
   static long const value = B * pow_helper&lt;B, E - 1&gt;::value;
 };

 template&lt;long B&gt;
 struct pow_helper&lt;B, 0&gt; {
   static long const value = 1;
 };

 template&lt;long B, long E&gt;
 struct power {
    static double const value;
 };

 template&lt;long B, long E&gt;
 double const power&lt;B, E&gt;::value= E &lt; 0 ? 1.0 / pow_helper&lt;B, E &lt; 0 ? -E : 0&gt;::value
                                        : pow_helper&lt;B, E &lt; 0 ? 0 : E&gt;::value;

 int main() {
   std::cout &lt;&lt; power&lt;10, -3&gt;::value &lt;&lt; std::endl;
 }
</code></pre>
<p>an dieser Stelle</p>
<pre><code class="language-cpp">pow_helper&lt;B, E &lt; 0 ? -E : 0&gt;
</code></pre>
<p>verstehe ich nicht was der ternäre Operator soll, da dieses Template doch sowieso nur &quot;ausgeführt&quot; wird wenn E &lt; 0.<br />
Ich habs getestet, ohne funktioniert es auch nicht, also hab ich irgendwo einen Denkfehler, in meinem Gedankenmodell funktionierts auch ohne, also:<br />
wozu ist die Abfrage da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548927</guid><dc:creator><![CDATA[JustAnotherNoob]]></dc:creator><pubDate>Thu, 17 Jul 2008 15:32:30 GMT</pubDate></item><item><title><![CDATA[Reply to templatemetaprogrammierung - Wikipediabeispiel, wozu der innere ternäre Operator? on Thu, 17 Jul 2008 15:53:40 GMT]]></title><description><![CDATA[<p>JustAnotherNoob schrieb:</p>
<blockquote>
<p>Hi,<br />
Bei Wikipedia gibt es zur Templatemetaprogrammierung folgendes Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
 
 template&lt;long B, unsigned long E&gt;
 struct pow_helper {
   static long const value = B * pow_helper&lt;B, E - 1&gt;::value;
 };
 
 template&lt;long B&gt;
 struct pow_helper&lt;B, 0&gt; {
   static long const value = 1;
 };
 
 template&lt;long B, long E&gt;
 struct power {
    static double const value;
 };
 
 template&lt;long B, long E&gt;
 double const power&lt;B, E&gt;::value= E &lt; 0 ? 1.0 / pow_helper&lt;B, E &lt; 0 ? -E : 0&gt;::value
                                        : pow_helper&lt;B, E &lt; 0 ? 0 : E&gt;::value;
 
 int main() {
   std::cout &lt;&lt; power&lt;10, -3&gt;::value &lt;&lt; std::endl;
 }
</code></pre>
<p>an dieser Stelle</p>
<pre><code class="language-cpp">pow_helper&lt;B, E &lt; 0 ? -E : 0&gt;
</code></pre>
<p>verstehe ich nicht was der ternäre Operator soll, da dieses Template doch sowieso nur &quot;ausgeführt&quot; wird wenn E &lt; 0.<br />
Ich habs getestet, ohne funktioniert es auch nicht, also hab ich irgendwo einen Denkfehler, in meinem Gedankenmodell funktionierts auch ohne, also:<br />
wozu ist die Abfrage da?</p>
</blockquote>
<p>Um unbeschränkte Instantiierung zu verhindern.<br />
Betrachte</p>
<pre><code class="language-cpp">a ? b : c;
</code></pre>
<p>Was ist der Typ dieses Ausdrucks? Offenbar hängt er vom den beiden Typen b und c ab. Also müssen diese Typen bestimmt werden, selbst dann, wenn a stets true oder false ist</p>
<pre><code class="language-cpp">true ? b : c;
false ? b : c;
</code></pre>
<p>Beide Ausdrücke haben den gleichen Typ (der von b und c abweichen kann) - in beiden Fällen wissen wir aber, dass nur ein einzelnes Argument b bzw c jewals ausgewertet werden wird.<br />
Bei unserem Template ist das nicht anders. Auch wenn wir uns für den konkreten Wert, den pow_helper&lt;B, E &lt; 0 ? 0 : E&gt;::value im Falle von E &lt; 0 nie interesseieren werden, müssen wir doch seinen Typ bestimmen, und das impliziert die Instantiierung dieses Templates als auch des statischen Members zusammen mit seinem Initialisierer. Letzteres würde zu unendlicher rekursiver Instantiierung führen, wenn wir durch den ternären Operator nicht auf einen Abbruchfall kommen würden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548939</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 17 Jul 2008 15:53:40 GMT</pubDate></item><item><title><![CDATA[Reply to templatemetaprogrammierung - Wikipediabeispiel, wozu der innere ternäre Operator? on Thu, 17 Jul 2008 15:55:04 GMT]]></title><description><![CDATA[<p>templates werden ausgewertet, unabhängig ob sie aufgerufen werden oder nicht. wenn man den trinären operator wegließe, würde das zu einer unendlichen rekursion führen, da bspw -1 dekrementiert niemals 0 also die abbruchbedingung der rekursion werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548942</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Thu, 17 Jul 2008 15:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to templatemetaprogrammierung - Wikipediabeispiel, wozu der innere ternäre Operator? on Thu, 17 Jul 2008 16:07:09 GMT]]></title><description><![CDATA[<p>Templates und Member von Templates werden implizit instantiiert, wenn deren Definition benötigt wird. Im Falle eines statischen Members also dann, wenn das Objekt existieren muss. Natürlich muss es existieren, damit es einen Wert haben kann, aber es gibt auch Fälle, in denen es eben darauf nicht ankommt.<br />
Betrachte z.B.</p>
<pre><code class="language-cpp">extern int a;
int b;
int c = false ? a : b;
</code></pre>
<p>Wenn a nun nirgendwo definiert wird, werden wir uns nicht wundern, falls der Linker sich über eine fehlende Definition beschwert (oder umgekehrt es nicht tut in diesem Fall). Obwohl es ja offensichtlich auf den konkreten Wert von a gar nicht ankommt.<br />
Nur um zu zeigen, dass das keine Eigenheit von Templates ist, sondern sich im Gegenteil widerspruchsfrei in den Rest der Sprache einfügt (und nat. trotzdem manchmal Kopfschmerzen bereiten kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548952</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 17 Jul 2008 16:07:09 GMT</pubDate></item></channel></rss>