<?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[Numeric_limits und Typen]]></title><description><![CDATA[<p>Servus,</p>
<p>ich stehe vor ein kleinem Problem und hierzu keine Lösung.<br />
Ich habe eine Variable x, die eine Fließkommazahl ist, und würde gerne das Epsilon auslesen. Leider geschied das an einer weit entfernten Stelle im Code, was bei der jetzigen Methode zu Fehler führen könnte z.B. bei umschreiben.</p>
<pre><code class="language-cpp">double x;
...
double ep = numeric_limits&lt;double&gt;::epsilon();
</code></pre>
<p>Wie kann ich den Typ der Variable x übergeben?</p>
<pre><code class="language-cpp">double ep = numeric_limits&lt;x&gt;::epsilon(); // Führt zu einem Fehler
</code></pre>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231041/numeric_limits-und-typen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 23:22:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231041.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jan 2009 20:09:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Numeric_limits und Typen on Mon, 05 Jan 2009 20:09:21 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich stehe vor ein kleinem Problem und hierzu keine Lösung.<br />
Ich habe eine Variable x, die eine Fließkommazahl ist, und würde gerne das Epsilon auslesen. Leider geschied das an einer weit entfernten Stelle im Code, was bei der jetzigen Methode zu Fehler führen könnte z.B. bei umschreiben.</p>
<pre><code class="language-cpp">double x;
...
double ep = numeric_limits&lt;double&gt;::epsilon();
</code></pre>
<p>Wie kann ich den Typ der Variable x übergeben?</p>
<pre><code class="language-cpp">double ep = numeric_limits&lt;x&gt;::epsilon(); // Führt zu einem Fehler
</code></pre>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640083</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Mon, 05 Jan 2009 20:14:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T&gt;
T getEpsilonFor(T dummy)
{
   return numeric_limits&lt;T&gt;::epsilon()
}
double ep = getEpsilonFor(x);
</code></pre>
<p>manchmal geht auch</p>
<pre><code class="language-cpp">double ep = numeric_limits&lt;typeof(x)&gt;::epsilon();
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">double ep = numeric_limits&lt;decltype(x)&gt;::epsilon();
</code></pre>
<p>aber das ist noch nicht standard.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640087</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:14:19 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Mon, 05 Jan 2009 20:22:46 GMT]]></title><description><![CDATA[<p>das erste setzt aktivierte runtime-type-information voraus, wenn ich mich recht erinnere.<br />
was ich mich allerdings frage, wie man es hinbekommt, das für x mehrere Typen in frage kommen, dass sollte eigentlich gar nicht gehen, da c++ ein stark typisierte Sprache ist.</p>
<p>im falle von template-funktionen, oder variablen, kann x trotzdem immer nur T (oder wie man das template genannt hat) annehmen., so dass ein numerical_limits&lt;T&gt;:: ausreichen sollte.</p>
<p>selbst wenn es irgendwie gehen sollte macht das zweite codeschnipsel des thread openers keinen Sinn, da das Ergebnis einen double zugewiesen wird, obwohl x ja scheinbar unbekannten Typs ist (und der des Rückgabewertes zwangsweise vom selben unbekannten Typ ist).</p>
<p>edit: typos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640090</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:22:46 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Mon, 05 Jan 2009 20:45:00 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>das erste setzt aktivierte runtime-type-information voraus, wenn ich mich recht erinnere.</p>
</blockquote>
<p>Nope.</p>
<blockquote>
<p>selbst wenn es irgendwie gehen sollte macht das zweite codeschnipsel des thread openers keinen Sinn, da das Ergebnis einen double zugewiesen wird, obwohl x ja scheinbar unbekannten Typs ist (und der des Rückgabewertes zwangsweise vom selben unbekannten Typ ist).</p>
</blockquote>
<p>Nein, es kann durchaus mal der Fall eintreten dass man den Typen einer Variable nicht kennt. Dann muss man den Weg ueber eine Funktion gehen die den Typen bestimmen kann oder auf ein typeof() hoffen (manchmal ist BOOST_TYPEOF hier ganz praktisch).</p>
<p>Idealer ist natuerlich<br />
typeof(x) y = numeric_limits&lt;typeof(x)&gt;::epsilon() oder aber long double verwenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640104</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Mon, 05 Jan 2009 20:57:12 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>das erste setzt aktivierte runtime-type-information voraus, wenn ich mich recht erinnere.<br />
was ich mich allerdings frage, wie man es hinbekommt, das für x mehrere Typen in frage kommen, dass sollte eigentlich gar nicht gehen, da c++ ein stark typisierte Sprache ist.</p>
</blockquote>
<p>Es geht um das Vermeiden von Fehlern bei coden.</p>
<pre><code class="language-cpp">double x;
... numeric_limits&lt;double&gt;::epsilon() ...
</code></pre>
<p>Ändere ich jetzt manuell den Type von double auf float, so muss ich auch die zweite Zeile anpassen. Wenn ich das nicht mache ist mein Code fehlerhaft.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a> Danke für deine Post. Ich programmiere nicht beruflich und bin daher nicht auf den neuesten Stand was den C++09 angeht. Endlich mal etwas praktisches <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/1640109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640109</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:57:12 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Tue, 06 Jan 2009 09:08:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Nein, es kann durchaus mal der Fall eintreten dass man den Typen einer Variable nicht kennt. Dann muss man den Weg ueber eine Funktion gehen die den Typen bestimmen kann oder auf ein typeof() hoffen (manchmal ist BOOST_TYPEOF hier ganz praktisch).</p>
</blockquote>
<p>Konstruier da mal bitte ein beispiel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640260</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 06 Jan 2009 09:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Tue, 06 Jan 2009 18:11:12 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<blockquote>
<p>Nein, es kann durchaus mal der Fall eintreten dass man den Typen einer Variable nicht kennt. Dann muss man den Weg ueber eine Funktion gehen die den Typen bestimmen kann oder auf ein typeof() hoffen (manchmal ist BOOST_TYPEOF hier ganz praktisch).</p>
</blockquote>
<p>Konstruier da mal bitte ein beispiel</p>
</blockquote>
<p>Makros.</p>
<p>Du generierst Code fuer bestimmte mathematische Funktionen und bekommst einen Wert uebergeben - weisst aber nicht welchen Typ er hat.</p>
<p>Oder aber du hast ein Predicate dass dir einen floating Point Wert liefert, aber du den genauen Typen nicht kennst.</p>
<p>Natuerlich kann man immer herum tricksen, aber typeof() ist einfach Gold Wert in vielen Faellen. Ein Problem mit fixen Typen ist ja nunmal, dass sie nicht dynamisch auf eine Aenderung eines Typen reagieren.</p>
<p>Ein</p>
<pre><code class="language-cpp">numeric_limits&lt;typeof(x)&gt;::epsilon()
</code></pre>
<p>ist einfach deutlich besser, weil es immer das korrekte epsilon liefert <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/1640575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640575</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 06 Jan 2009 18:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Tue, 06 Jan 2009 19:17:02 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Makros.</p>
<p>Du generierst Code fuer bestimmte mathematische Funktionen und bekommst einen Wert uebergeben - weisst aber nicht welchen Typ er hat.</p>
</blockquote>
<p>wir sind hier in c++. für sowas benutzt man template funktionen.</p>
<blockquote>
<p>Oder aber du hast ein Predicate dass dir einen floating Point Wert liefert, aber du den genauen Typen nicht kennst.</p>
</blockquote>
<p>wie soll das aussehen? Wie kann mir etwas einen wert liefern, ohne definierten Typ? (mal abgesehen von void zeigern)</p>
<blockquote>
<p>Ein</p>
<pre><code class="language-cpp">numeric_limits&lt;typeof(x)&gt;::epsilon()
</code></pre>
<p>ist einfach deutlich besser, weil es immer das korrekte epsilon liefert <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>
</blockquote>
<p>denoch muss auch der rückgabewert vom selben typ sein wie z.</p>
<p>btw: ich habe typeof zwar schon mal gesehen, kriegs im vcc 8 nicht aber grad nicht compiliert. was braucht man denn. um das benutzen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640618</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 06 Jan 2009 19:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Tue, 06 Jan 2009 22:49:54 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Makros.</p>
<p>Du generierst Code fuer bestimmte mathematische Funktionen und bekommst einen Wert uebergeben - weisst aber nicht welchen Typ er hat.</p>
</blockquote>
<p>wir sind hier in c++. für sowas benutzt man template funktionen.</p>
</blockquote>
<p>Mach mir doch mal bitte ganz kurz eine template Funktion fuer max(a,b)</p>
<p>danke <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>templates sind meistens die richtige Wahl, aber leider nicht immer. Deshalb kommt ja auch decltype in den neuen Standard, dann kann man ploetzlich auch Sachen wie max(a,b) als template schreiben ohne einen schreikrampf zu bekommen.</p>
<blockquote>
<p>wie soll das aussehen? Wie kann mir etwas einen wert liefern, ohne definierten Typ? (mal abgesehen von void zeigern)</p>
</blockquote>
<pre><code class="language-cpp">template&lt;typename Pred&gt;
int divide(int num, Pred p) {
  return num/p();
}

int i() { return 3; }
double d() { return 0.3; }

int main() {
  cout&lt;&lt;divide(7,i);
  cout&lt;&lt;divide(8, d);
}
</code></pre>
<blockquote>
<p>denoch muss auch der rückgabewert vom selben typ sein wie z.</p>
</blockquote>
<p>Oder aber man nimmt einen grossen floating point typ der alles kann... uU nimmt man die variable fuer den man den epsilon wert wissen will selbst...</p>
<blockquote>
<p>btw: ich habe typeof zwar schon mal gesehen, kriegs im vcc 8 nicht aber grad nicht compiliert. was braucht man denn. um das benutzen zu können.</p>
</blockquote>
<p>es ist eine non standard erweiterung. nimm BOOST_TYPEOF</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640727</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 06 Jan 2009 22:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Tue, 06 Jan 2009 23:47:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class T&gt; T get_epsilon(T const&amp;)
{
    return numeric_limits&lt;T&gt;::epsilon();
}

// ...

//double ep = numeric_limits&lt;x&gt;::epsilon(); // Führt zu einem Fehler
double ep = get_epsilon(x);
</code></pre>
<p>hm?</p>
<p>Also als &quot;Notlösung&quot; bis wir decltype haben, was natürlich wesentlich schöner ist, da kein dummer Workaround.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640751</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 06 Jan 2009 23:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 00:26:35 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;class T&gt; T get_epsilon(T const&amp;)
{
    return numeric_limits&lt;T&gt;::epsilon();
}

// ...

//double ep = numeric_limits&lt;x&gt;::epsilon(); // Führt zu einem Fehler
double ep = get_epsilon(x);
</code></pre>
<p>hm?</p>
<p>Also als &quot;Notlösung&quot; bis wir decltype haben, was natürlich wesentlich schöner ist, da kein dummer Workaround.</p>
</blockquote>
<p>ja und nein.</p>
<p>ja: wir warten auf typeof oder sowas. damit wäre das netter.</p>
<p>nein: im gegensatz zu verdammt vielen workarounds ist das mal ausnahmsweise ein workaround, der recht gut funktioniert und gar nicht notwendig macht, daß man drüber nachdenkt, die sprache zu verändern.</p>
<p>ja, weil wegen vieler anderer fälle typeof oder was ähnliches auf der wuschliste ganz weit oben steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640778</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 07 Jan 2009 00:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 09:38:49 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Mach mir doch mal bitte ganz kurz eine template Funktion fuer max(a,b)<br />
danke <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>
</blockquote>
<p>Die brauch man nicht machen, die gibts schon in algorithms:<br />
std::max und std::min</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename Pred&gt;
int divide(int num, Pred p) {
  return num/p();
}

int i() { return 3; }
double d() { return 0.3; }

int main() {
  cout&lt;&lt;divide(7,i);
  cout&lt;&lt;divide(8, d);
}
</code></pre>
</blockquote>
<p>ein typeof von einer funktion geht genauso wenig, oder? da müsste ja sowas wie (double *funname(void)) als typ zurückkommen.<br />
Ich sehe also nicht, wie das hier weiterhefen sollte.</p>
<blockquote>
<p>Oder aber man nimmt einen grossen floating point typ der alles kann... uU nimmt man die variable fuer den man den epsilon wert wissen will selbst...</p>
</blockquote>
<p>wenn ich aber zb ne bigint klasse habe, die selbst der größte floatingpoint typ nicht mit ausreichender genauigkeit abbilden kann?<br />
da reicht schon ein int64, da verliert man bei großen zahlen, die letzten stellen bei doubles. wenn man dann mit dem ergebnis von numeric_limits&lt;int64&gt;.max() in einem double weiterrechnet gibts ungenauigkeiten.</p>
<blockquote>
<blockquote>
<p>btw: ich habe typeof zwar schon mal gesehen, kriegs im vcc 8 nicht aber grad nicht compiliert. was braucht man denn. um das benutzen zu können.</p>
</blockquote>
<p>es ist eine non standard erweiterung. nimm BOOST_TYPEOF</p>
</blockquote>
<p>bin mir sicher, dass ich schonmal was compiliert habe, wo sowas drin war. __typeof scheint es auch zu gebben, zumindest färbt er es blau.<br />
Beim compile meckert er trotzdem über unknwon identifier</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640942</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Wed, 07 Jan 2009 09:38:49 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 09:55:09 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>Die brauch man nicht machen, die gibts schon in algorithms:<br />
std::max und std::min</p>
</blockquote>
<p>He he, du bist darauf reingefallen <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>ich kann mit Makros ein</p>
<pre><code class="language-cpp">float a=max(1,0.2);
</code></pre>
<p>machen. Mit templates nicht. dh, ich kann es schon machen, aber der Code ist enorm... Vorallem wenn man dann noch ein<br />
&quot;max(1,0.2)&quot; also ohne Zuweisung supporten will.</p>
<p>Ist nicht ganz trivial - wenn dir einmal langweilig ist versuche das Problem zu lösen, ist ganz interessant (Alexandrescu hat dazu einen Artikel geschrieben, gibt es sicher auch online).</p>
<blockquote>
<p>ein typeof von einer funktion geht genauso wenig, oder? da müsste ja sowas wie (double *funname(void)) als typ zurückkommen.<br />
Ich sehe also nicht, wie das hier weiterhefen sollte.</p>
</blockquote>
<p>doch, geht - zumindest mit dem neuen Standard.</p>
<p>Wichtig ist ja auch dass sowas geht:<br />
decltype(a&lt;b)</p>
<p>ein max() mit dem neuen standard wäre dann zB:</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
auto max(A const&amp; a, B const&amp; b) -&gt; decltype(a&lt;b) {
  return a&lt;b ? b : a;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1640953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640953</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 07 Jan 2009 09:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 09:59:44 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
auto max(A const&amp; a, B const&amp; b) -&gt; decltype(a&lt;b) {
  return a&lt;b ? b : a;
}
</code></pre>
</blockquote>
<p>return bool?<br />
jetzt haste mich aber neugierig gemacht, wie max mit dem neuen standard geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640955</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 07 Jan 2009 09:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 10:00:43 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>jetzt haste mich aber neugierig gemacht, wie max mit dem neuen standard geht.</p>
</blockquote>
<p>arg, das war falsch rum - mein fehler.</p>
<p>muss mal googlen - denn irgendwie gingen expression auswertungen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640956</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 07 Jan 2009 10:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 10:13:58 GMT]]></title><description><![CDATA[<p>So, korrekter Code wäre dann:</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
auto max(A const&amp; a, B const&amp; b) -&gt; decltype(a&lt;b?b:a) {
  return a&lt;b ? b : a;
}
</code></pre>
<p>manchmal ist es doch so simpel...</p>
<p>Ob es wirklich geht weiss ich nicht, theoretisch müsste es so gehen und ich habe es in einer c.l.c++.mod diskussion gesehen.</p>
<p>So, newsgroup thread wieder gefunden:<br />
<a href="http://groups.google.com/group/comp.lang.c++.moderated/msg/15d528fbdf578267" rel="nofollow">http://groups.google.com/group/comp.lang.c++.moderated/msg/15d528fbdf578267</a></p>
<p>PS:<br />
interessanter Punkt hierbei ist, dass max() daduch by value returned - aber ich denke mit type_traits dürfte das eigentlich kein Problem sein:</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
auto max(A const&amp; a, B const&amp; b) -&gt; boost::call_traits&lt;decltype(a&lt;b?b:a)&gt;::reference {
  return a&lt;b ? b : a;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1640960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640960</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 07 Jan 2009 10:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 11:28:47 GMT]]></title><description><![CDATA[<blockquote>
<p>ich kann mit Makros ein</p>
<pre><code class="language-cpp">float a=max(1,0.2);
</code></pre>
<p>machen.</p>
</blockquote>
<blockquote>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
auto max(A const&amp; a, B const&amp; b) -&gt; decltype(a&lt;b?b:a) {
  return a&lt;b ? b : a;
}
</code></pre>
</blockquote>
<p>Ich weiß noch nicht so recht, ob ich sowas gut finden sollte.<br />
schließlich vergleichst du in so einem Fall Äpfel mit Birnen und gibst eins von beiden zurück, dh der tatsächliche typ steht erst zur laufzeit fest.</p>
<p>Das widerspricht komplett den prinzipien einer streng typisierten Sprache, als die c++ mal konzipiert wurde.<br />
Wenn man sowas machen will, sollte man, denke ich eine andere Sprache wählen und nicht eine bestehende noch mehr verwässern und aufweichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641000</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Wed, 07 Jan 2009 11:28:47 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 11:35:45 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>Das widerspricht komplett den prinzipien einer streng typisierten Sprache, als die c++ mal konzipiert wurde.<br />
Wenn man sowas machen will, sollte man, denke ich eine andere Sprache wählen und nicht eine bestehende noch mehr verwässern und aufweichen.</p>
</blockquote>
<p>Bei int/float vielleicht, aber das Problem existiert ja auch bei int32/int64 und sonstigen Vergleichen. Aktuell ist es so, dass ich explizit den größeren Typen angeben muss:</p>
<pre><code class="language-cpp">int64 c=max&lt;int64&gt;(a, b);
</code></pre>
<p>aber wenn wir uns das mit dem neuen Standard ansehen:</p>
<pre><code class="language-cpp">auto c = max(a,b);
</code></pre>
<p>viel besser.</p>
<p>Stell dir ein:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T keine_negativen_zahlen_erlaubt(T n) {
  return max(0, n);
}
</code></pre>
<p>Generell ist das Problem dass mich der Typ von variablen nie interessiert. Wenn ich 2 Variablen habe die kompatibel zueinander sind, dann reicht mir das. Bsp: int16, int32 und int64 sind für mich identisch solange ich keine overflows produziere. Deshalb sind templates toll, weil ich Code unabhängig vom Typ schreiben kann.</p>
<p>Wenn du dir einmal Sprachen mit Type Inference ansiehst wirst du schnell merken wie Bequem es ist den Typen einer variable nicht kennen zu müssen.</p>
<p>Nur weil du den Typ nicht kennst oder er dich nicht interessiert ist die Sprache ja nicht schwach getypt. mein max() ist streng typisiert und wenn du einen blödsinn machen willst wie zB max(&quot;hallo&quot;, vector&lt;int&gt;()) dann fliegt dir das um die Ohren. Wenn du aber double und int vergleichen willst, dann ist das ok und er promoted den int zu einem double und liefert dir das. Alles was der Code macht ist das explizite spezifizieren des größeren Typen (wie man es jetzt macht) zu automatisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641003</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 07 Jan 2009 11:35:45 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 14:52:55 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<blockquote>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
auto max(A const&amp; a, B const&amp; b) -&gt; decltype(a&lt;b?b:a) {
  return a&lt;b ? b : a;
}
</code></pre>
</blockquote>
<p>Ich weiß noch nicht so recht, ob ich sowas gut finden sollte.<br />
schließlich vergleichst du in so einem Fall Äpfel mit Birnen und gibst eins von beiden zurück, dh der tatsächliche typ steht erst zur laufzeit fest.</p>
</blockquote>
<p>C++ bleibt weiterhin statisch typisiert.<br />
Der Ausdruck <code>a&lt;b?b:a</code> hat in C++ genau einen (statischen) Typ, genau den selben Typ wie er auch ohne decltype hier schon verwendet wird (der &quot;?&quot; Operator ist ja nicht neu). Welcher das ist kannst du dir ja mit dem Funktions-Template Trick anzeigen lassen.<br />
Und genau diesen Typ liefert dann eben <code>decltype(a&lt;b?b:a)</code> .</p>
<p>Wenn der Compiler keinen geeigneten Typ finden kann (bzw. genauer: wenn der C++ Standard sagt dass es keinen geeigneten Typ für diesen Ausdruck gibt), dann wird er einen Fehler ausspucken. Auch daran ändert decltype nichts.</p>
<p>Beispiel: <code>a &lt; b ? &quot;sepp&quot; : 42</code> wird nicht compilieren, genauso wird <code>decltype(a &lt; b ? &quot;sepp&quot; : 42)</code> nicht compilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641144</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 07 Jan 2009 14:52:55 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 14:58:45 GMT]]></title><description><![CDATA[<p>Das kann doch aber nur als constexpr funktionieren, oder nicht? <code>decltype(a&lt;b?b:a)</code> muss ja zur Compile-Zeit feststehen; wenn a und b Variablen sind, ist das wohl nicht möglich. Kann sein, dass ich da grad quer denke oder was übersehen hab, aber mir scheint das etwas obskur.. <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/1641147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641147</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 07 Jan 2009 14:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 15:01:36 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Das kann doch aber nur als constexpr funktionieren, oder nicht? <code>decltype(a&lt;b?b:a)</code> muss ja zur Compile-Zeit feststehen; wenn a und b Variablen sind, ist das wohl nicht möglich. Kann sein, dass ich da grad quer denke oder was übersehen hab, aber mir scheint das etwas obskur.. <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>
</blockquote>
<p>der returntype von ?: bestimmt sich durch integer promotion, das läuft und lief schon immer zur compilezeit.<br />
aber ich muss zugeben, daß ich auch ins schwitzen kam bei dem konstrukt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641151</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 07 Jan 2009 15:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 15:42:58 GMT]]></title><description><![CDATA[<p>Hast du zufällig Lust, mir das zu erklären? &quot;Integer Promotion&quot; hatte ich nie gehört, Google hat aber geholfen. Verstehe trotzdem nicht, wie <code>decltype(a&lt;b?b:a)</code> ausgewertet wird, wie wird denn da &quot;a&lt;b&quot; behandelt, etwa die Limits ihrer Typen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641176</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 07 Jan 2009 15:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 17:55:14 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>wie wird denn da &quot;a&lt;b&quot; behandelt, etwa die Limits ihrer Typen?</p>
</blockquote>
<p>Falscher Ansatz.</p>
<p>a&lt;b liefert ein bool, aber das ist fuer den decltype egal.</p>
<p>Wenn ich</p>
<pre><code class="language-cpp">short a=7;
</code></pre>
<p>schreibe, ist es ja auch klar was passiert. 7 ist zwar ein int aber er wird zu einem short promoted mit uU einem werteverlust.</p>
<p>Wenn ich nun</p>
<pre><code class="language-cpp">3f + 7d;
</code></pre>
<p>schreibe, dann muss der ergebnis typ ja vorher feststehen, oder? unabhaengig welche werte die beiden operanden haben. Wir wissen es: double ist das Ergebnis.</p>
<p>Bei a&lt;b?b:a ist es das selbe: das ergebnis ist ein typ der sowohl a als auch b beinhalten kann. Wir wissen ja nicht ob a oder b als ergebnis kommt, deshalb muessen wir beide speichern koennen.</p>
<p>Deshalb geht auch folgendes nicht:</p>
<pre><code class="language-cpp">double d = true ? 0.7 : &quot;hallo&quot;;
</code></pre>
<p>obwohl wir wissen dass immer 0.7 als ergebnis raus kommt sind char* und double dennoch inkompatibel und duerfen hier nicht verwendet werden.</p>
<pre><code class="language-cpp">decltype(a&lt;b?b:a)
</code></pre>
<p>macht nun nichts anderes als den typen zu bestimmen den man braucht um sowohl a als auch b beinhalten zu koennen.</p>
<p>uU ist es bei einem</p>
<pre><code class="language-cpp">decltype(a+b)
</code></pre>
<p>logischer?</p>
<p>Ich weiss zwar nicht wieviel a+b ist, aber ich weiss dass short + int = int ist.</p>
<p>Das ganze klappt natuerlich auch mit UDT:</p>
<pre><code class="language-cpp">string a;
char* b;
decltype(a+b) c;
</code></pre>
<p>c muss vom typ string sein. Denn fuer string + char* finde ich genau einen match, naemlich:</p>
<pre><code class="language-cpp">string operator+(string const&amp; a, char const* b);
</code></pre>
<p>aus der string klasse.</p>
<p>wenn der operator+ mehrdeutig waere, wuerde decltype einen fehler liefern.<br />
in prinzip ist also decltype(a+b) ja nur die kurzschreibweise fuer</p>
<pre><code class="language-cpp">decltype(operator+(a,b))
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1641266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641266</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 07 Jan 2009 17:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Numeric_limits und Typen on Wed, 07 Jan 2009 18:00:58 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Hast du zufällig Lust, mir das zu erklären? &quot;Integer Promotion&quot; hatte ich nie gehört, Google hat aber geholfen. Verstehe trotzdem nicht, wie <code>decltype(a&lt;b?b:a)</code> ausgewertet wird, wie wird denn da &quot;a&lt;b&quot; behandelt, etwa die Limits ihrer Typen?</p>
</blockquote>
<p>decltype(a&lt;b?b:a) funktioniert gleich wie sizeof(a&lt;b?b:a) - der Compiler guckt einfach was für einen Typ der Ausdruck &quot;a&lt;b?b:a&quot; hat und substituiert dann den typ bzw. bei sizeof die grösse.</p>
<p>es gehen ja auch so dinge wie sizeof(a+b) oder sizeof(my_function()) oder sizeof((my_class().my_function().yet_another_function() &lt;&lt; 42) + 23) oder ...<br />
und eben auch mit decltype.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641276</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 07 Jan 2009 18:00:58 GMT</pubDate></item></channel></rss>