<?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[Partial Specialization]]></title><description><![CDATA[<p>Hallo,</p>
<p>leider nochmals eine Frage zu Templates. Leider konnte ich beim googlen hierauf keine Antwort. Zumindest keine die mir wirklich weiter hilft.</p>
<p>Könnt ihr mir sagen, was ich falsch mache?</p>
<pre><code class="language-cpp">template&lt;int geschwindigkeit, bool vierraeder&gt;
struct fahrzeug;

template&lt;&gt;
struct fahrzeug&lt; geschwindigkeit&lt;200 , true&gt;
{
 string Autoname; 
};

template&lt;&gt;
struct &lt;fahrzeug&lt; geschwindigkeit &gt; 300, false&gt;
{
 string schnelles_motorrad;
};
</code></pre>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247192/partial-specialization</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 16:52:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247192.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Aug 2009 12:21:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 12:21:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>leider nochmals eine Frage zu Templates. Leider konnte ich beim googlen hierauf keine Antwort. Zumindest keine die mir wirklich weiter hilft.</p>
<p>Könnt ihr mir sagen, was ich falsch mache?</p>
<pre><code class="language-cpp">template&lt;int geschwindigkeit, bool vierraeder&gt;
struct fahrzeug;

template&lt;&gt;
struct fahrzeug&lt; geschwindigkeit&lt;200 , true&gt;
{
 string Autoname; 
};

template&lt;&gt;
struct &lt;fahrzeug&lt; geschwindigkeit &gt; 300, false&gt;
{
 string schnelles_motorrad;
};
</code></pre>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756907</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Fri, 07 Aug 2009 12:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 12:38:01 GMT]]></title><description><![CDATA[<p>Du verstösst gegen die Syntax. Deine &lt; und &gt; sind völlig an falschen Orten platziert und du gibst auch unnötige, bzw. fehlerhafte Bezeichner an. Es müsste wohl so lauten:</p>
<pre><code class="language-cpp">template&lt;int geschwindigkeit, bool vierraeder&gt;
struct fahrzeug;

template&lt;&gt;
struct fahrzeug&lt;200 , true&gt;
{
 string Autoname; 
};

template&lt;&gt;
struct fahrzeug&lt;300, false&gt;
{
 string schnelles_motorrad;
};
</code></pre>
<p>Wobei ich mich allerdings über dieses Beispiel schon ein wenig wundere. Für sowas würde ich keine Templatespezialisierung verwenden <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756920</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 Aug 2009 12:38:01 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 12:41:25 GMT]]></title><description><![CDATA[<p>Hallo Dravere,</p>
<p>leider bildet diese nicht das ab, was ich haben möchte. Bei mir war das '&lt;' ein kleiner Operator.</p>
<p>Was mache ich nun am besten? Ein Makro &quot;kleiner&quot; und dafür dann beide Templateparameter bool?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756923</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Fri, 07 Aug 2009 12:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 12:50:50 GMT]]></title><description><![CDATA[<p>MrMilk schrieb:</p>
<blockquote>
<p>leider bildet diese nicht das ab, was ich haben möchte.</p>
</blockquote>
<p>Dann sag, was du haben möchtest! Denn dein Beispiel ist einfach syntaxmässig falsch. Dazu braucht man nicht einmal einen Kompiler.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756930</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 Aug 2009 12:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 12:56:34 GMT]]></title><description><![CDATA[<p>Ich denke, dass MrMilk jeweils eine Spezialisierung von fahrzeug&lt;geschw,vierr&gt; für den Fall (geschw&lt;200 &amp;&amp; vierr) und für den Fall (geschw&gt;300 &amp;&amp; !vierr) erzeugen möchte.</p>
<p>Das geht allerdings niht so einfach. Zumindest gibt es keine &quot;partielle Spezialisierung&quot; für nicht-Typ-Parameter.</p>
<p>MrMilk kann aber so etwas machen:</p>
<pre><code class="language-cpp">template&lt;int Klasse, bool Vierrad&gt;
struct fahr_dings_impl { /*...*/ };
template&lt;&gt;
struct fahr_dings_impl&lt;0,true&gt; { /*...*/ };  // Fall &quot;&lt;200&quot;
template&lt;&gt;
struct fahr_dings_impl&lt;2,false&gt; { /*...*/ }; // Fall &quot;&gt;300&quot;

template&lt;int Geschw, bool Vierrad&gt;
struct fahrzeug
: fahr_dings_impl&lt;((Geschw&gt;=200)+(Geschw&gt;300)),Vierrad&gt; {};
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// berechnet aus der Geschwindigkeit die &quot;Klasse&quot;
</code></pre>
<p>Das übergeordete Ziel von MrMilk lässt sich aber bestimmt auch eleganter lösen. Nur dazu fehlen die Informationen.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756935</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 07 Aug 2009 12:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 12:59:56 GMT]]></title><description><![CDATA[<p>Hallo Dravere,</p>
<p>ich möchte, dass bei einem Wert der Variable 'geschwindigkeit' mit kleiner als 200 und wenn die Variable 'vierraeder' wahr ist, die erste Struktur genommen wird.</p>
<p>Sollte der Werte der Variable 'geschwindigkeit' größer als 300 und die Variable 'vierraeder' falsch sein, dann die zweite Struktur.</p>
<p>Tut mir leid, dass ich mich so schlecht ausdrücke.<br />
Verstehst du worauf ich hinaus möchte?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756937</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Fri, 07 Aug 2009 12:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 13:03:33 GMT]]></title><description><![CDATA[<p>MrMilk schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>leider nochmals eine Frage zu Templates. Leider konnte ich beim googlen hierauf keine Antwort. Zumindest keine die mir wirklich weiter hilft.</p>
<p>Könnt ihr mir sagen, was ich falsch mache?</p>
<pre><code class="language-cpp">template&lt;int geschwindigkeit, bool vierraeder&gt;
struct fahrzeug;

template&lt;&gt;
struct fahrzeug&lt; geschwindigkeit&lt;200 , true&gt;
{
 string Autoname; 
};

template&lt;&gt;
struct &lt;fahrzeug&lt; geschwindigkeit &gt; 300, false&gt;
{
 string schnelles_motorrad;
};
</code></pre>
<p>Viele Grüße<br />
MM</p>
</blockquote>
<p>Du musst das spezialisieren was du deklariert hast. Und dein allgemeines Template hat als ersten Parameter ein int, die Spezialisierungen aber ein bool.</p>
<p>Wenn du allgemein nach schnell oder langsam unterscheiden willst, aber dennoch die Geschwindigkeiten mit eine Rolle spielen, kannst du sowas machen:</p>
<pre><code class="language-cpp">template&lt;bool schnell, int geschw, bool vierraeder&gt;
struct fahrzeug_schnellangsam
{
  void brumm() { std::cout &lt;&lt; &quot;ich bin schnell (&quot; &lt;&lt; geschw &lt;&lt; &quot;)!&quot; &lt;&lt; std::endl; } //code fuer schnelles auto
};
template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug_schnellangsam&lt;false /*nicht schnell*/, geschw, vierraeder&gt;
{
  void brumm() { std::cout &lt;&lt; &quot;tucker, tucker... (&quot;&lt;&lt; geschw &lt;&lt; &quot;)&quot; &lt;&lt; std::endl ; } //code fuer langsames fahrzeug
};

template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug  //das was du am Ende benutzt
  : public fahrzeug_schnellangsam&lt;(geschw&gt;200)/*klammern sind pflicht!*/, geschw, vierraeder&gt;
{};

int main()
{
  fahrzeug&lt;290, true&gt; flitzer;
  fahrzeug&lt;90, true&gt; trecker;

  flitzer.brumm();
  trecker.brumm();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1756940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756940</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 07 Aug 2009 13:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 13:20:42 GMT]]></title><description><![CDATA[<p>MrMilk schrieb:</p>
<blockquote>
<p>Tut mir leid, dass ich mich so schlecht ausdrücke.<br />
Verstehst du worauf ich hinaus möchte?</p>
</blockquote>
<p>Aha, jetzt! Hättest du das doch von Anfang an hingeschrieben <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="🙂"
    /><br />
Aber inzwischen haben zwei geantwortet, mit zwei von vielen Möglichkeiten.</p>
<p>Wichtig ist, dass man keine Bedingungen für einen Parameter setzen kann. Wenn du spezialisiert, kannst du einfach nur einen oder mehrere Parameter durch einen festen Wert oder Typ ersetzen.<br />
Wenn du Bedingungen einführen willst, dann musst du entsprechende Hilfstrukturen dazunehmen, wie es Sebastian Pizer und pumuckl gezeigt haben.</p>
<p>Womit lernst du aktuell die Templatemetaprogrammierung?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756959</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 Aug 2009 13:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 14:38:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte mit &quot;Modern C++ Design&quot; anfangen. Dieses hat bei Amazon sehr gute Bewertungen bekommen. Bevor ich damit anfange, wollte ich mir grundsätzlich noch einmal Templates anschauen.</p>
<p>Eine Frage hab ich noch zu der Lösung von pumuckel:</p>
<pre><code class="language-cpp">template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug_schnellangsam&lt;false /*nicht schnell*/, geschw, vierraeder&gt;
{
  void brumm() { std::cout &lt;&lt; &quot;tucker, tucker... (&quot;&lt;&lt; geschw &lt;&lt; &quot;)&quot; &lt;&lt; std::endl ; } //code fuer langsames fahrzeug
};
</code></pre>
<p>Fehlt hier eventuell ein Parameter (bool schnell)?</p>
<p>bzw. wieso sind hier keine Spitzen klammern hinter dem Namen der Struktur</p>
<pre><code class="language-cpp">template&lt;bool schnell, int geschw, bool vierraeder&gt; 
struct fahrzeug_schnellangsam 
{ 
  void brumm() { std::cout &lt;&lt; &quot;ich bin schnell (&quot; &lt;&lt; geschw &lt;&lt; &quot;)!&quot; &lt;&lt; std::endl; } //code fuer schnelles auto 
};
</code></pre>
<p>Um mich zu testen, ob ich dieses richtig verstanden hab:</p>
<p>Idee dieser Lösungsart ist dass noch eine spezialisierte Struktur im Hintergrund auf die passend abgebildet wird. Angenommen, ich möchte jetzt in drei Bereich aufteilen: bis 100, bis 1000 und ende offen, dann würde man zwei bool Variablen nehmen, oder?</p>
<p>Viele grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756970</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Fri, 07 Aug 2009 14:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 14:56:21 GMT]]></title><description><![CDATA[<p>MrMilk schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug_schnellangsam&lt;false /*nicht schnell*/, geschw, vierraeder&gt;
{
  void brumm() { std::cout &lt;&lt; &quot;tucker, tucker... (&quot;&lt;&lt; geschw &lt;&lt; &quot;)&quot; &lt;&lt; std::endl ; } //code fuer langsames fahrzeug
};
</code></pre>
<p>Fehlt hier eventuell ein Parameter (bool schnell)?</p>
</blockquote>
<p>Nein. Dies ist eine partielle spezialisierung von template&lt;bool, int, bool&gt; struct fahrzeug_schnellangsam, wo das erste bool fest mit false belegt ist.</p>
<blockquote>
<p>bzw. wieso sind hier keine Spitzen klammern hinter dem Namen der Struktur</p>
<pre><code class="language-cpp">template&lt;bool schnell, int geschw, bool vierraeder&gt; 
struct fahrzeug_schnellangsam 
{ 
  void brumm() { std::cout &lt;&lt; &quot;ich bin schnell (&quot; &lt;&lt; geschw &lt;&lt; &quot;)!&quot; &lt;&lt; std::endl; } //code fuer schnelles auto 
};
</code></pre>
</blockquote>
<p>Dies ist der allgemeine Fall, also keine Spezialisierung. Man könnte das in etwa so lesen: &quot;ALLE fahrzeuge sagen 'ich bin schnell' (allgemeiner Fall), ABER die fahrzeuge wo der erste parameter false ist, sagen 'ich bin langsam' (spezialisierung)&quot;</p>
<p>Man hätte auch das allgemeine Template nur deklarieren können, um es dann einmal für true und eimal für false zu spezialisieren.</p>
<blockquote>
<p>Angenommen, ich möchte jetzt in drei Bereich aufteilen: bis 100, bis 1000 und ende offen, dann würde man zwei bool Variablen nehmen, oder?</p>
</blockquote>
<p>Sinnvoller wäre da vermutlich ein enum, dessen Wert dann entweder über den ?:-Operator entschieden wird oder über ein weiteres helfertemplate:</p>
<pre><code class="language-cpp">enum TempoSelect { LAHM, NORMAL, SCHNELL };
template&lt;TempoSelect schnell, int geschw, bool vierraeder&gt;
struct fahrzeug_schnellnormallangsam
{
  void brumm() { std::cout &lt;&lt; &quot;ich bin schnell (&quot; &lt;&lt; geschw &lt;&lt; &quot;)!&quot; &lt;&lt; std::endl; } //code fuer schnelles auto
};
template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug_schnellnormallangsam&lt;NORMAL, geschw, vierraeder&gt;
{
  void brumm() { std::cout &lt;&lt; &quot;voll normal... (&quot;&lt;&lt; geschw &lt;&lt; &quot;)&quot; &lt;&lt; std::endl ; } //code fuer langsames fahrzeug
};
template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug_schnellnormallangsam&lt;LAHM, geschw, vierraeder&gt;
{
  void brumm() { std::cout &lt;&lt; &quot;tucker, tucker... (&quot;&lt;&lt; geschw &lt;&lt; &quot;)&quot; &lt;&lt; std::endl ; } //code fuer langsames fahrzeug
};

template&lt;int geschw, bool vierraeder&gt;
struct fahrzeug  //das was du am Ende benutzt
  : public fahrzeug_schnellnormallangsam&lt;((geschw&gt;200)?SCHNELL:(geschw&lt;100)?LAHM:NORMAL)/*klammern sind pflicht!*/, geschw, vierraeder&gt;
{};

int main()
{
  fahrzeug&lt;290, true&gt; flitzer;
  fahrzeug&lt;130, true&gt; meinauto;
  fahrzeug&lt;90, true&gt; trecker;

  meinauto.brumm();
  flitzer.brumm();
  trecker.brumm();
}
</code></pre>
<p>Auch hier hätte man wieder den allgemeinen Fall nur deklarieren können und für SCHNELL eine partielle spezialisierung machen.</p>
<blockquote>
<p>ich möchte mit &quot;Modern C++ Design&quot; anfangen. Dieses hat bei Amazon sehr gute Bewertungen bekommen. Bevor ich damit anfange, wollte ich mir grundsätzlich noch einmal Templates anschauen.</p>
</blockquote>
<p>Ich empfehle vorher &quot;C++ Templates - The Complete Guide&quot; zu lesen. Die vermitteln sehr gut die Grundlagen, so dass man hinterher Alexandrescus nette Spielereien recht einfach verstehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756991</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 07 Aug 2009 14:56:21 GMT</pubDate></item><item><title><![CDATA[Reply to Partial Specialization on Fri, 07 Aug 2009 15:39:46 GMT]]></title><description><![CDATA[<p>Super, nun habe ich es verstanden. Danke für euere Geduld.</p>
<p>Ich habe es so gelöst, dass ich als erstes den Standardfall geschrieben habe und von diesem dann die Spezialfälle abgeleitet hab.</p>
<p>Das Template besteht aus einem Integer und zwei boolschen Parametern. Die vier bool-Fälle wurden abgedeck. Somit sollte ich immer in einem Spezialfall laden.</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757007</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Fri, 07 Aug 2009 15:39:46 GMT</pubDate></item></channel></rss>