<?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[Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt;]]></title><description><![CDATA[<p>Hallo alle!</p>
<p>In diesem <a href="https://www.c-plusplus.net/forum/335804-full">Thread</a> geht es um das Einlesen von <a href="https://de.wikipedia.org/wiki/Windows_Bitmap" rel="nofollow">Windows-BMP-Dateien</a>.</p>
<p>Mir geht es jetzt um das Einlesen von integralen Datentypen und das Einlesen von structs mit hilfe von operator&gt;&gt;():</p>
<p>Beim stöbern auf <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> bin ich auf <a href="http://en.cppreference.com/w/cpp/io/basic_istream/sentry" rel="nofollow">std::basic_istream::sentry</a> gestoßen.</p>
<p>Dort steht:</p>
<blockquote>
<p>An object of class basic_istream::sentry is constructed in local scope at the beginning of each member function of std::basic_istream that performs input (both formatted and unformatted). Its constructor prepares the input stream: checks if the stream is already in a failed state, flushes the tie()'d output streams, skips leading whitespace unless noskipws flag is set, and performs other implementation-defined tasks if necessary. All cleanup, if necessary, is performed in the destructor, so that it is guaranteed to happen if exceptions are thrown during input.</p>
</blockquote>
<p>Ich selbst hab den operator&gt;&gt; z.B. so implementiert</p>
<pre><code>class klasse {
  std::istream &amp;is;

[...]
  // Sebi hat da was hübscheres ala:
  // template &lt;class T, class = std::enable_if_t&lt;std::is_integral&lt;T&gt;::value&gt;&gt;
  // Aber ich bin noch nicht so fit mit Templates, daher die einfache Variante (obwohl es verständlich ist):
  template &lt;typename T&gt;
  klasse &amp; operator&gt;&gt;(T &amp; t)
  {
    if(is.good())
      is.read( reinterpret_cast&lt;char*&gt;(&amp;t), sizeof(T) );
    return is;
  }
};
</code></pre>
<p>Oder ohne Abfrage weil ich mir dachte read prüft sowieso den Status und springt direkt zurück wenn is.good() == false ist.<br />
Was soll man auch machen, das failbit zusätzlich setzen?</p>
<pre><code>[...]
  template &lt;typename T&gt;
  klasse &amp; operator&gt;&gt;(T &amp; t)
  {
    is.read( reinterpret_cast&lt;char*&gt;(&amp;t), sizeof(T) );
    return is;
  }
[...]
</code></pre>
<p>Tja, und jetzt frage ich mich ob das der Weg ist den man gehen soll:</p>
<pre><code>[...]
  template &lt;typename T&gt;
  klasse &amp; operator&gt;&gt;(T &amp; t)
  {
    std::istream::sentry sentry(is, true);
    if (sentry)
      is.read( reinterpret_cast&lt;char*&gt;(&amp;t), sizeof(T) );
    return is;
  }
[...]
</code></pre>
<p>Nur, ist das nötig. Oder gibt es bestimmte Situationen wo das besser ist?<br />
Und, wenn es besser ist und ich mehrere read-Aufrufe habe sollte ich das vor jeden read testen (meine Meinung) oder alle reads in einen if-Block?</p>
<pre><code>[...]
    std::istream::sentry sentry(is, true);
    if (sentry)
      is.read( reinterpret_cast&lt;char*&gt;(&amp;var1), sizeof(var1) );
    if (sentry)
      is.read( reinterpret_cast&lt;char*&gt;(&amp;var2), sizeof(var2) );
[... oder ...]
if (sentry) {
  is.read( reinterpret_cast&lt;char*&gt;(&amp;var1), sizeof(var1) );
  is.read( reinterpret_cast&lt;char*&gt;(&amp;var2), sizeof(var2) );
  }
</code></pre>
<p>In dem Text auf <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> steht das jede Lesefunktion von std::istream<br />
sentry benutzt, egal ob formatierte oder unformatierte Eingabe.<br />
In dem Infokästchen zum Konstruktor steht wiederum „Prepares the stream for formatted input.“</p>
<p>Es ist unten auf der Seite auch ein Beispiel für einen operator&gt;&gt;:</p>
<pre><code>std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Foo&amp; f)
{
    std::istream::sentry s(is);
    if (s)
        is.read(f.n, 5);
    return is;
}
</code></pre>
<p>Was meint ihr dazu?</p>
<p>So, jetzt geht's weiter mit den Fragen:<br />
Ich glaube ich habe möglicherweise den Unterschied zw. <a href="http://en.cppreference.com/w/cpp/concept/FormattedInputFunction" rel="nofollow">FormattedInputFunction</a> und <a href="http://en.cppreference.com/w/cpp/concept/UnformattedInputFunction" rel="nofollow">UnformattedInputFunction</a> noch nicht richtig verstanden.</p>
<p>Unter formatierter Eingabe habe ich immer das konvertieren von lesbaren Text nach z.B. int verstanden, inkl. der Datums-/Zahlenumwandlung nach der eingestellten locale.<br />
Typische Eingaberoutinen sind dann operator&gt;&gt;() aber auch get(). Bei unformatierter das typische read() das einfach eine Anzahl char/wchar_t ohne Umwandlung einliest.</p>
<p>Und dann kamen mir ein paar Fragen zum Stil auf: Sollte man überhaupt den operator&gt;&gt; für das binäre Einlesen benutzen?<br />
Also es stellt sich mir die Frage ob erstens das binäre Einlesen in integrale Datentypen (== unformatiert) vom Konzept<br />
her falsch ist und auf der anderen Seite man das einlesen einer ganzen struct wiederum als formatierte Eingabe sehen kann (== vom Konzept richtig)?<br />
Also quasi eine binäre Eingabe „formatiert“ in eine struct schreiben.</p>
<p>Und noch eine Frage zum Einlesen von Daten in eine struct:<br />
Wäre der richtige Weg zum Einlesen so wie es die stdlib mit <a href="http://en.cppreference.com/w/cpp/io/manip/get_time" rel="nofollow">std::get_time()</a> macht?</p>
<p>Was ist get_time eigentlich? eine Funktion oder eine Klasse?</p>
<pre><code>template &lt;class charT&gt; /*T9*/ get_time(struct tm* tmb, const charT* fmt);
</code></pre>
<p>Sie müsste doch eine Refernz auf... zurückgeben... Schere im Kopf, moment:</p>
<pre><code>stream &gt;&gt; get_time(&amp;t, fmt)  ==  stream.operator&gt;&gt;( get_time(&amp;t, fmt) )
</code></pre>
<p>Ok, get_time ist hier eine (Template) inline-Funktion und gibt eine struct _get_time zurück, genauer ein Template (g++-5)<br />
Also gibt es einen operator&gt;&gt;(_get_time &amp; gt). Wäre das zumindest geklärt. Oder Denkfehler meinerseits?</p>
<p>Eine kleine Frage noch:<br />
Gibt es einen Grund warum z.B. operator&gt;&gt;(int) nicht auf binäres lesen (also sizeof(int)) umschaltet wenn man einen istream mit std::ios_base::openmode::binary öffnet?</p>
<p>Vielleicht hat jemand ein paar Antworten,<br />
einen schönen Tag noch</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/335879/fragen-zu-sentry-formatierte-unformatierte-eingabe-und-operator-gt-gt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 02:06:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335879.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Dec 2015 12:50:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 12:50:11 GMT]]></title><description><![CDATA[<p>Hallo alle!</p>
<p>In diesem <a href="https://www.c-plusplus.net/forum/335804-full">Thread</a> geht es um das Einlesen von <a href="https://de.wikipedia.org/wiki/Windows_Bitmap" rel="nofollow">Windows-BMP-Dateien</a>.</p>
<p>Mir geht es jetzt um das Einlesen von integralen Datentypen und das Einlesen von structs mit hilfe von operator&gt;&gt;():</p>
<p>Beim stöbern auf <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> bin ich auf <a href="http://en.cppreference.com/w/cpp/io/basic_istream/sentry" rel="nofollow">std::basic_istream::sentry</a> gestoßen.</p>
<p>Dort steht:</p>
<blockquote>
<p>An object of class basic_istream::sentry is constructed in local scope at the beginning of each member function of std::basic_istream that performs input (both formatted and unformatted). Its constructor prepares the input stream: checks if the stream is already in a failed state, flushes the tie()'d output streams, skips leading whitespace unless noskipws flag is set, and performs other implementation-defined tasks if necessary. All cleanup, if necessary, is performed in the destructor, so that it is guaranteed to happen if exceptions are thrown during input.</p>
</blockquote>
<p>Ich selbst hab den operator&gt;&gt; z.B. so implementiert</p>
<pre><code>class klasse {
  std::istream &amp;is;

[...]
  // Sebi hat da was hübscheres ala:
  // template &lt;class T, class = std::enable_if_t&lt;std::is_integral&lt;T&gt;::value&gt;&gt;
  // Aber ich bin noch nicht so fit mit Templates, daher die einfache Variante (obwohl es verständlich ist):
  template &lt;typename T&gt;
  klasse &amp; operator&gt;&gt;(T &amp; t)
  {
    if(is.good())
      is.read( reinterpret_cast&lt;char*&gt;(&amp;t), sizeof(T) );
    return is;
  }
};
</code></pre>
<p>Oder ohne Abfrage weil ich mir dachte read prüft sowieso den Status und springt direkt zurück wenn is.good() == false ist.<br />
Was soll man auch machen, das failbit zusätzlich setzen?</p>
<pre><code>[...]
  template &lt;typename T&gt;
  klasse &amp; operator&gt;&gt;(T &amp; t)
  {
    is.read( reinterpret_cast&lt;char*&gt;(&amp;t), sizeof(T) );
    return is;
  }
[...]
</code></pre>
<p>Tja, und jetzt frage ich mich ob das der Weg ist den man gehen soll:</p>
<pre><code>[...]
  template &lt;typename T&gt;
  klasse &amp; operator&gt;&gt;(T &amp; t)
  {
    std::istream::sentry sentry(is, true);
    if (sentry)
      is.read( reinterpret_cast&lt;char*&gt;(&amp;t), sizeof(T) );
    return is;
  }
[...]
</code></pre>
<p>Nur, ist das nötig. Oder gibt es bestimmte Situationen wo das besser ist?<br />
Und, wenn es besser ist und ich mehrere read-Aufrufe habe sollte ich das vor jeden read testen (meine Meinung) oder alle reads in einen if-Block?</p>
<pre><code>[...]
    std::istream::sentry sentry(is, true);
    if (sentry)
      is.read( reinterpret_cast&lt;char*&gt;(&amp;var1), sizeof(var1) );
    if (sentry)
      is.read( reinterpret_cast&lt;char*&gt;(&amp;var2), sizeof(var2) );
[... oder ...]
if (sentry) {
  is.read( reinterpret_cast&lt;char*&gt;(&amp;var1), sizeof(var1) );
  is.read( reinterpret_cast&lt;char*&gt;(&amp;var2), sizeof(var2) );
  }
</code></pre>
<p>In dem Text auf <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> steht das jede Lesefunktion von std::istream<br />
sentry benutzt, egal ob formatierte oder unformatierte Eingabe.<br />
In dem Infokästchen zum Konstruktor steht wiederum „Prepares the stream for formatted input.“</p>
<p>Es ist unten auf der Seite auch ein Beispiel für einen operator&gt;&gt;:</p>
<pre><code>std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Foo&amp; f)
{
    std::istream::sentry s(is);
    if (s)
        is.read(f.n, 5);
    return is;
}
</code></pre>
<p>Was meint ihr dazu?</p>
<p>So, jetzt geht's weiter mit den Fragen:<br />
Ich glaube ich habe möglicherweise den Unterschied zw. <a href="http://en.cppreference.com/w/cpp/concept/FormattedInputFunction" rel="nofollow">FormattedInputFunction</a> und <a href="http://en.cppreference.com/w/cpp/concept/UnformattedInputFunction" rel="nofollow">UnformattedInputFunction</a> noch nicht richtig verstanden.</p>
<p>Unter formatierter Eingabe habe ich immer das konvertieren von lesbaren Text nach z.B. int verstanden, inkl. der Datums-/Zahlenumwandlung nach der eingestellten locale.<br />
Typische Eingaberoutinen sind dann operator&gt;&gt;() aber auch get(). Bei unformatierter das typische read() das einfach eine Anzahl char/wchar_t ohne Umwandlung einliest.</p>
<p>Und dann kamen mir ein paar Fragen zum Stil auf: Sollte man überhaupt den operator&gt;&gt; für das binäre Einlesen benutzen?<br />
Also es stellt sich mir die Frage ob erstens das binäre Einlesen in integrale Datentypen (== unformatiert) vom Konzept<br />
her falsch ist und auf der anderen Seite man das einlesen einer ganzen struct wiederum als formatierte Eingabe sehen kann (== vom Konzept richtig)?<br />
Also quasi eine binäre Eingabe „formatiert“ in eine struct schreiben.</p>
<p>Und noch eine Frage zum Einlesen von Daten in eine struct:<br />
Wäre der richtige Weg zum Einlesen so wie es die stdlib mit <a href="http://en.cppreference.com/w/cpp/io/manip/get_time" rel="nofollow">std::get_time()</a> macht?</p>
<p>Was ist get_time eigentlich? eine Funktion oder eine Klasse?</p>
<pre><code>template &lt;class charT&gt; /*T9*/ get_time(struct tm* tmb, const charT* fmt);
</code></pre>
<p>Sie müsste doch eine Refernz auf... zurückgeben... Schere im Kopf, moment:</p>
<pre><code>stream &gt;&gt; get_time(&amp;t, fmt)  ==  stream.operator&gt;&gt;( get_time(&amp;t, fmt) )
</code></pre>
<p>Ok, get_time ist hier eine (Template) inline-Funktion und gibt eine struct _get_time zurück, genauer ein Template (g++-5)<br />
Also gibt es einen operator&gt;&gt;(_get_time &amp; gt). Wäre das zumindest geklärt. Oder Denkfehler meinerseits?</p>
<p>Eine kleine Frage noch:<br />
Gibt es einen Grund warum z.B. operator&gt;&gt;(int) nicht auf binäres lesen (also sizeof(int)) umschaltet wenn man einen istream mit std::ios_base::openmode::binary öffnet?</p>
<p>Vielleicht hat jemand ein paar Antworten,<br />
einen schönen Tag noch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479880</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Thu, 17 Dec 2015 12:50:11 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 13:28:35 GMT]]></title><description><![CDATA[<p>Jeder Aufruf von .read() erstellt bereits ein sentry Objekt wie <a href="http://en.cppreference.com/w/cpp/io/basic_istream/read" rel="nofollow">hier</a> beschrieben. Wenn man also nicht noch zusätzlichen Whitespace überspringen will, wie in dem Beispiel, dann braucht man es selbst nicht.</p>
<p>Ob es sinnvoll ist den <code>operator&gt;&gt;</code> für binäre Sachen zu missbrauchen kann man sich streiten. Ich finde es in diesem Fall einfach praktischer weil man alles hintereinander weg schreiben kann.</p>
<p>std::get_time ist eine Funktion und gibt einen nicht näher festgelegten Typ zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479886</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Thu, 17 Dec 2015 13:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 17:25:48 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Jeder Aufruf von .read() erstellt bereits ein sentry Objekt wie <a href="http://en.cppreference.com/w/cpp/io/basic_istream/read" rel="nofollow">hier</a> beschrieben. Wenn man also nicht noch zusätzlichen Whitespace überspringen will, wie in dem Beispiel, dann braucht man es selbst nicht.</p>
<p>Ob es sinnvoll ist den <code>operator&gt;&gt;</code> für binäre Sachen zu missbrauchen kann man sich streiten. Ich finde es in diesem Fall einfach praktischer weil man alles hintereinander weg schreiben kann.</p>
<p>std::get_time ist eine Funktion und gibt einen nicht näher festgelegten Typ zurück.</p>
</blockquote>
<p>Zu 1) Dann habe ich da was missverstanden und kann mir das sparen <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>
<p>Zu 2) Ja, sieht schöner aus und scheinen ja auch alle so zu machen...</p>
<p>Zu get_time():</p>
<p>Hmm, wenn ich das richtig sehe geht es bei get_time() nur darum 2 Argumente auf der rechten Seite des operator&gt;&gt; angeben zu können...</p>
<p>Hier sieht das so aus:<br />
(gcc version 5.3.1 20151207 [gcc-5-branch revision 231355] (SUSE Linux))</p>
<pre><code>template&lt;typename _CharT&gt;
    struct _Get_time
    {
      std::tm*      _M_tmb;
      const _CharT* _M_fmt;
    };

  template&lt;typename _CharT&gt;
    inline _Get_time&lt;_CharT&gt;
    get_time(std::tm* __tmb, const _CharT* __fmt)
    { return { __tmb, __fmt }; }

  template&lt;typename _CharT, typename _Traits&gt;
    basic_istream&lt;_CharT, _Traits&gt;&amp;
    operator&gt;&gt;(basic_istream&lt;_CharT, _Traits&gt;&amp; __is, _Get_time&lt;_CharT&gt; __f)
{...}
</code></pre>
<p>Ich tippe</p>
<pre><code>stream &gt;&gt; get_time(&amp;tm, &quot;format&quot;);
</code></pre>
<p>ein, folgendes passiert:</p>
<p><s>Der operator&gt;&gt;(_Get_time) wird aufgerufen.</s></p>
<p><s>Dieser ruft get_time() mit einer *Adresse* auf eine std::tm struct und einem Formatstring (by_value) auf die ich get_time() übergeben habe.</s></p>
<p><s>get_time() wiederum gibt *by_value* die aus 2 Werten bestehende interne struct _Get_time an operator&gt;&gt; zurück.</s></p>
<p>std::get_time() wird mit den <strong>Adressen</strong> einer std::tm-struct und einem Formatstring als Argumente aufgerufen. Diese macht nichts und gibt die 2 Argumente 1:1 <strong>by_value</strong> als interne struct _Get_time zurück.</p>
<p>Mit dem Rückgabewert vom Typ _Get_time wird der operator&gt;&gt;(basic_istream&amp;, _Get_time) aufgerufen.</p>
<p>Aus der <strong>by_value</strong> übergebenen struct _Get_time holt sich der operator&gt;&gt; die <strong>Adresse</strong> des std::tm-Objekts heraus und füllt diese....</p>
<p>Hoffe ich habe das so richtig interpretiert.</p>
<p>Edit: siehe unten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479894</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Thu, 17 Dec 2015 17:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 14:29:50 GMT]]></title><description><![CDATA[<p>Deine Interpretation stimmt soweit, außer das <code>operator&gt;&gt;</code> natürlich erst aufgerufen wird nachdem <code>get_time()</code> durch ist. Und das ist natürlich nur eine Möglichkeit das zu implementieren. Der Standard schreibt nicht vor wie man es machen soll, nur was passieren soll. In anderen Implementierung kann das struct ganz anders heißen, andere Member haben oder überhaupt gar kein struct sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479896</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Thu, 17 Dec 2015 14:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 14:38:46 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Deine Interpretation stimmt soweit, außer das <code>operator&gt;&gt;</code> natürlich erst aufgerufen wird nachdem <code>get_time()</code> durch ist.</p>
</blockquote>
<p>Ja natürlich! Jetzt hab ich das extra so genau eingetippt und doch noch ein Fehler drin.</p>
<p>sebi707 schrieb:</p>
<blockquote>
<p>Und das ist natürlich nur eine Möglichkeit das zu implementieren. Der Standard schreibt nicht vor wie man es machen soll, nur was passieren soll. In anderen Implementierung kann das struct ganz anders heißen, andere Member haben oder überhaupt gar kein struct sein.</p>
</blockquote>
<p>Jep, ich wollte mir halt angucken wie es praktisch gemacht wird. Hatte einen Knoten im Kopf von wg. rechter Operand ist eine Funktion, was gibt die Funktion zurück und welcher operator&gt;&gt; wird dann aufgerufen... Passiert mir öfters, dann muss ich mir das selbst so aufschreiben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479897</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Thu, 17 Dec 2015 14:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 14:51:31 GMT]]></title><description><![CDATA[<p>Eine Frage noch @sebi707:</p>
<p>Dein Beispielcode für die BinaryReader-Klasse aus dem anderen Thread:</p>
<pre><code>template &lt;class T, class = std::enable_if_t&lt;std::is_integral&lt;T&gt;::value&gt;&gt; 
  BinaryReader&amp; operator&gt;&gt; (T&amp; value) 
  { 
    m_in.read(reinterpret_cast&lt;char*&gt;(&amp;value), sizeof(T)); 
    return *this; 
  }
</code></pre>
<p>Ich hatte zuerst Fehler bekommen weil ich #include &lt;type_traits&gt; vergessen hatte. Als ich 'enable' in die Suche von <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> eingetippt habe bekam ich als Ergebnis (unter anderen)<br />
<a href="http://en.cppreference.com/w/cpp/types/enable_if" rel="nofollow">std::enable_if</a> serviert. std::enable_if_t geht aber auch.</p>
<p>Ist das beides das selbe, std::enable_if_t wird nicht bei <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> gelistet.<br />
Ich vermute das es früher so hieß und dann umbenannt wurde, den alten Bezeichner hat man dann aus Kompatibilitätsgründen beibehalten?</p>
<p>g++ nimmt beide und meckert auch nicht wg. depreated oder so...</p>
<p>Bin erstmal raus für eine Stunde...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479898</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Thu, 17 Dec 2015 14:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 15:30:45 GMT]]></title><description><![CDATA[<p>dirkski schrieb:</p>
<blockquote>
<p>Ist das beides das selbe, std::enable_if_t wird nicht bei <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> gelistet.<br />
Ich vermute das es früher so hieß und dann umbenannt wurde, den alten Bezeichner hat man dann aus Kompatibilitätsgründen beibehalten?</p>
</blockquote>
<p>Nein es ist nicht beides das Gleiche. Die Schreibweise <code>std::enable_if_t&lt;zeug&gt;</code> ist die Kurzform (seit C++14) von <code>typename std::enable_if&lt;zeug&gt;::type</code> . Wenn du einfach das <code>_t</code> weglässt kriegst du nicht das was man erwartet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479903</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Thu, 17 Dec 2015 15:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu sentry, formatierte&#x2F;unformatierte Eingabe und operator&amp;gt;&amp;gt; on Thu, 17 Dec 2015 15:44:11 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>dirkski schrieb:</p>
<blockquote>
<p>Ist das beides das selbe, std::enable_if_t wird nicht bei <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> gelistet.<br />
Ich vermute das es früher so hieß und dann umbenannt wurde, den alten Bezeichner hat man dann aus Kompatibilitätsgründen beibehalten?</p>
</blockquote>
<p>Nein es ist nicht beides das Gleiche. Die Schreibweise <code>std::enable_if_t&lt;zeug&gt;</code> ist die Kurzform (seit C++14) von <code>typename std::enable_if&lt;zeug&gt;::type</code> . Wenn du einfach das <code>_t</code> weglässt kriegst du nicht das was man erwartet.</p>
</blockquote>
<p>Ok ok... Ich hätte mir mal das Example auf <a href="http://cppreference.com" rel="nofollow">cppreference.com</a> angucken können, dann hätte ich es gesehen...</p>
<p>Danke nochmal <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/2479909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479909</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Thu, 17 Dec 2015 15:44:11 GMT</pubDate></item></channel></rss>