<?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[type_traits]]></title><description><![CDATA[<p>Hi <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>Ich hab mal wieder eine Frage zum Buch <a href="http://www.thalia.at/shop/at_thalia_start/suchartikel/c_11/peter_pohmann/ISBN3-86802-106-X/ID35067343.html?fftrk=1%3A1%3A10%3A10%3A1&amp;jumpId=27548972" rel="nofollow">http://www.thalia.at/shop/at_thalia_start/suchartikel/c_11/peter_pohmann/ISBN3-86802-106-X/ID35067343.html?fftrk=1%3A1%3A10%3A10%3A1&amp;jumpId=27548972</a></p>
<p>Ein Auszug aus einem Programm:</p>
<pre><code>template&lt;typename T, typename IsIntegral&gt;
struct Equality {
};

template&lt;typename T&gt;
struct Equality&lt;T, std::true_type&gt; {
   Equality(T a, T b) { // was wird denn hier aufgerufen????????
      value = (a == b);
   }
   bool value;
};

template&lt;typename T&gt;
bool IsEqual(T a, T b) {
   return Equality&lt;T, typename std::is_integral&lt;T&gt;::type&gt;(a, b).value;
}

int a = 8;
int b = 7;
bool ri = IsEqual(a, b);
</code></pre>
<p>Es geht um diesen Equality-Aufruf. Was wird denn da aufgerufen? Ein Konstruktor eines anderen structs <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324783/type_traits</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 23:30:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324783.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Apr 2014 17:37:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 17:39:56 GMT]]></title><description><![CDATA[<p>Hi <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>Ich hab mal wieder eine Frage zum Buch <a href="http://www.thalia.at/shop/at_thalia_start/suchartikel/c_11/peter_pohmann/ISBN3-86802-106-X/ID35067343.html?fftrk=1%3A1%3A10%3A10%3A1&amp;jumpId=27548972" rel="nofollow">http://www.thalia.at/shop/at_thalia_start/suchartikel/c_11/peter_pohmann/ISBN3-86802-106-X/ID35067343.html?fftrk=1%3A1%3A10%3A10%3A1&amp;jumpId=27548972</a></p>
<p>Ein Auszug aus einem Programm:</p>
<pre><code>template&lt;typename T, typename IsIntegral&gt;
struct Equality {
};

template&lt;typename T&gt;
struct Equality&lt;T, std::true_type&gt; {
   Equality(T a, T b) { // was wird denn hier aufgerufen????????
      value = (a == b);
   }
   bool value;
};

template&lt;typename T&gt;
bool IsEqual(T a, T b) {
   return Equality&lt;T, typename std::is_integral&lt;T&gt;::type&gt;(a, b).value;
}

int a = 8;
int b = 7;
bool ri = IsEqual(a, b);
</code></pre>
<p>Es geht um diesen Equality-Aufruf. Was wird denn da aufgerufen? Ein Konstruktor eines anderen structs <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392206</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Tue, 01 Apr 2014 17:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 17:44:18 GMT]]></title><description><![CDATA[<p>da wird der konstruktor definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392207</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Tue, 01 Apr 2014 17:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 17:46:14 GMT]]></title><description><![CDATA[<p>Wenn das der Konstruktor ist, wozu brauche ich dann die Zeilen 1 bis 3?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392208</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Tue, 01 Apr 2014 17:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 17:55:08 GMT]]></title><description><![CDATA[<blockquote>
<p>// was wird denn hier aufgerufen????????</p>
</blockquote>
<p>Da wird nichts aufgerufen, da wird ein Konstruktor definiert. Innerhalb der Definition einer <em>partiellen Spezialisierung</em> definiert man den Konstruktor ganz normal.</p>
<p>Du könntest auch</p>
<pre><code>Equality&lt;T, std::true_type&gt;(T a, T b) { ... }
</code></pre>
<p>Schreiben, um den Konstruktor zu definieren; ist es dann klarer? Man lässt die Qualifizierung mit der Argumentenliste im Allgemeinen weg</p>
<pre><code>Equality(T a, T b) {}
</code></pre>
<p>Das darf man, weil innerhalb der Definition (und generell im Scope) eines Klassentemplates der Name des Templates automatisch auch - je nach Kontext - auf den Namen der momentan instantiierten Spezialisierung verweist. Diesen Namen nennt man dann <em>injected-class-name</em>.</p>
<pre><code>template&lt;typename T&gt;
struct A
{
	using type = A; // type ist A&lt;T&gt;
};

A&lt;int&gt;::A::type b; // B ist vom Typ A&lt;int&gt;::A::type = A&lt;int&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2392209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392209</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 01 Apr 2014 17:55:08 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 18:35:53 GMT]]></title><description><![CDATA[<p>Wenn ich die Zeilen 1 bis 3 auskommentiere, bekomme ich eine Fehlermeldung: 'Equality' is not a class template</p>
<p>Ok, brauche ich also. Wird da irgendwie unsichtbar was geerbt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392213</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Tue, 01 Apr 2014 18:35:53 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 18:37:47 GMT]]></title><description><![CDATA[<p>tröröö schrieb:</p>
<blockquote>
<p>Wenn ich die Zeilen 1 bis 3 auskommentiere, bekomme ich eine Fehlermeldung: 'Equality' is not a class template</p>
<p>Ok, brauche ich also. Wird da irgendwie unsichtbar was geerbt?</p>
</blockquote>
<p>lies in deinem buch nach was (partielle) templatespezialisierung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392214</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Tue, 01 Apr 2014 18:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 18:40:41 GMT]]></title><description><![CDATA[<p>Jetzt dämmert mir was.</p>
<p>Ich dachte, man KANN etwas spezialisieren. Mir war nicht klar, dass es die allgemeinere Form geben MUSS <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/2392216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392216</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Tue, 01 Apr 2014 18:40:41 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 18:42:36 GMT]]></title><description><![CDATA[<p>tröröö schrieb:</p>
<blockquote>
<p>Jetzt dämmert mir was.</p>
<p>Ich dachte, man KANN etwas spezialisieren. Mir war nicht klar, dass es die allgemeinere Form geben MUSS <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>wenn du diese nicht wünschst, dann kannst du sie deklarieren ohne sie zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392217</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Tue, 01 Apr 2014 18:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Tue, 01 Apr 2014 18:47:00 GMT]]></title><description><![CDATA[<p>tröröö schrieb:</p>
<blockquote>
<p>Ok, brauche ich also. Wird da irgendwie unsichtbar was geerbt?</p>
</blockquote>
<p>Nein, das nennt sich Template Spezialisierung, in diesem Fall sogar partielle Template Spezialisierung.<br />
Ich nehme ein Beispiel aus der Standardbibliothek.<br />
Du kennst mit Sicherheit std::vector.<br />
std::vector arbeitet mit allen Typen gleich, es speichert sie einfach. Allerdings kam irgendeiner auf die &quot;tolle&quot; Idee, das man denn für bool irgendwie optimieren könnte. Wie genau die Optimierung aussieht und wieso die Mist ist, ist hier irrelevant. Uns interessiert die Implementierung.<br />
Man hat also std::vector, der sieht in etwa so aus:</p>
<pre><code>template &lt;typename T, class Allocator = std::default_allocator&lt;T&gt;&gt;
class vector
{
  // die ganzen Funktionen etc.
};
</code></pre>
<p>Wie sorgt man nun dafür, dass er für bool anders funktioniert?<br />
Nun man spezialisiert das Template.<br />
Ignorieren wir mal für einen Moment den Allocator, dann sähe das so aus:</p>
<pre><code>// Basistemplate
template &lt;typename T&gt;
class vector {...};
// Spezialiserung für bool
template &lt;&gt; //&lt; Kennzeichen einer Spezialisierung
class vector&lt;bool&gt; // diese Klasse wird verwendet, wenn man den vector mit bool instanziiert
{
  // spezielle Funktionen für bool
};
</code></pre>
<p>Instanziiert man nun vector mit bool, wird die Spezialisierung genommen.<br />
Wie sieht das nun für die Version mit Allocator aus?<br />
So:</p>
<pre><code>// Basistemplate
template &lt;typename T, class Allocator&gt;
class vector {...};
// Spezialiserung für bool
template &lt;class Allocator&gt; // (2)
class vector&lt;bool, Allocator&gt; // (1)
{...};
</code></pre>
<p>Bei (1) sagen wir: Diese Spezialisierung gilt für alle vector, die mit bool und einem beliebigen Allocator instanziiert werden. Wie drücken wir aus, dass es ein beliebiger Allocator sein soll und nicht etwa std::default_allocator? Nun wie sonst auch: Mit einem Template. In (2) führen wir erneut den Namen Allocator ein um den als Platzhalter für einen beliebigen Typen nutzen zu können.<br />
In deinem Fall spezialisierst du nun Equality einfach für alle Instanziierungen mit einem beliebigen Typen und std::true_type als zweites Argument.</p>
<p>Edit: Oh, hätte mir das auch sparen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392218</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 01 Apr 2014 18:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to type_traits on Wed, 02 Apr 2014 09:17:19 GMT]]></title><description><![CDATA[<p>tröröö schrieb:</p>
<blockquote>
<p>Ich dachte, man KANN etwas spezialisieren. Mir war nicht klar, dass es die allgemeinere Form geben MUSS <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>Wenn Du nix hast, kannst Du nix spezialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392290</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 02 Apr 2014 09:17:19 GMT</pubDate></item></channel></rss>