<?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[Klassentemplate: Nur einzelne Methoden spezialisieren]]></title><description><![CDATA[<p>Hallo, schön nach langer Zeit mal wieder hier zu sein.<br />
Jetzt habe ich wieder mit C++ angefangen und gleich habe ich ein Problem. Es geht um ein Klassentemplate.</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
class basic_matrix
  : //... (boost operators)
{
  //...
  boost::array&lt;T, m*n&gt; data; //hier könnte ich auch ein zweidimensionales Array nehmen, aber ob das schneller ist...
  public:
  //allerlei operatoren und methoden
};
</code></pre>
<p>So weit so gut. Jetzt gibt es aber für quadratische Matritzen einige spezielle Operationen, die ich implementieren will, invertieren, Determinant berechnen, Transponieren etc. Außerdem will ich für Matritzen der Größen 4*4, 3*3 und 2*2 noch ein paar etwas schnellere Varianten dieser Operationen implementieren. Das schreit natürlich nach Templatespezialisierung, und die ist im Grunde auch garkein Problem. Aber wenn ich jetzt z.B. basic_matrix&lt;T, 3, 3&gt; spezialisiere, dann muss ich ALLE anderen Operationen wie Addieren, Subtrahieren usw. alle neu reinschreiben. Da dachte ich mir, na dann leite ich einfach von basic_matrix ab und überlade alle Operationen, die sich ändern. Aber das geht nicht, denn</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class basic_matrix&lt;T, 3, 3&gt;
  :basic_matrix&lt;T, 3, 3&gt;
{
  T determinant();
  //...
};
</code></pre>
<p>gibt verständlicherweise einen Fehler wegen unendlicher Rekusion. Im Internet habe ich nur allgemeine Infos über Templatespezialisierung gefunden, nichts, was meinem Problem ähnlich ist. Aber irgendwie kann ich nicht glauben, dass das ein Einzelfall ist.<br />
geloescht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170900/klassentemplate-nur-einzelne-methoden-spezialisieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 09:50:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170900.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Jan 2007 18:24:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sat, 20 Jan 2007 18:24:44 GMT]]></title><description><![CDATA[<p>Hallo, schön nach langer Zeit mal wieder hier zu sein.<br />
Jetzt habe ich wieder mit C++ angefangen und gleich habe ich ein Problem. Es geht um ein Klassentemplate.</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
class basic_matrix
  : //... (boost operators)
{
  //...
  boost::array&lt;T, m*n&gt; data; //hier könnte ich auch ein zweidimensionales Array nehmen, aber ob das schneller ist...
  public:
  //allerlei operatoren und methoden
};
</code></pre>
<p>So weit so gut. Jetzt gibt es aber für quadratische Matritzen einige spezielle Operationen, die ich implementieren will, invertieren, Determinant berechnen, Transponieren etc. Außerdem will ich für Matritzen der Größen 4*4, 3*3 und 2*2 noch ein paar etwas schnellere Varianten dieser Operationen implementieren. Das schreit natürlich nach Templatespezialisierung, und die ist im Grunde auch garkein Problem. Aber wenn ich jetzt z.B. basic_matrix&lt;T, 3, 3&gt; spezialisiere, dann muss ich ALLE anderen Operationen wie Addieren, Subtrahieren usw. alle neu reinschreiben. Da dachte ich mir, na dann leite ich einfach von basic_matrix ab und überlade alle Operationen, die sich ändern. Aber das geht nicht, denn</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class basic_matrix&lt;T, 3, 3&gt;
  :basic_matrix&lt;T, 3, 3&gt;
{
  T determinant();
  //...
};
</code></pre>
<p>gibt verständlicherweise einen Fehler wegen unendlicher Rekusion. Im Internet habe ich nur allgemeine Infos über Templatespezialisierung gefunden, nichts, was meinem Problem ähnlich ist. Aber irgendwie kann ich nicht glauben, dass das ein Einzelfall ist.<br />
geloescht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213337</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Sat, 20 Jan 2007 18:24:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sat, 20 Jan 2007 18:38:42 GMT]]></title><description><![CDATA[<p>Du kannst dir behelfen, indem du auch im allgemeinen Fall ableitest:</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
class basic_matrix_base
// ...
};

template &lt;typename T, int m, int n&gt;
class basic_matrix
  : public basic_matrix_base&lt;T, m, n&gt;
//...  nur ctors und ggf. zuweisung
};

template &lt;typename T&gt;
class basic_matrix&lt;T, 3, 3&gt;
  :basic_matrix_base&lt;T, 3, 3&gt;
//...
};
</code></pre>
<p>usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213344</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 20 Jan 2007 18:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sat, 20 Jan 2007 18:44:02 GMT]]></title><description><![CDATA[<p>ah, danke, darauf bin ich nicht gekommen. Wird zwar etwas mehr Code, aber sehr viel weniger als wenn ich wirklich alles doppelt und dreifach schreiben würde.<br />
Dann hab ich noch ne Frage, ich hab irgendwo in der Boost-Doku, genauergesagt hier <a href="http://boost.org/libs/utility/operators.htm#chaining" rel="nofollow">http://boost.org/libs/utility/operators.htm#chaining</a> (ich hab mit boost gerade erst angefangen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> aber es erleichtert doch einiges) gelesen, dass bei manchen Compilern bei Ableitung von Klassen ohne Member die Objektgröße anwächst. Da auch mal große Mengen an Matrizen und Vektoren gespeichert werden sollen wäre das nicht sehr schön. Ist das wirklich so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213349</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Sat, 20 Jan 2007 18:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sat, 20 Jan 2007 19:37:59 GMT]]></title><description><![CDATA[<p>geloescht schrieb:</p>
<blockquote>
<p>ah, danke, darauf bin ich nicht gekommen. Wird zwar etwas mehr Code, aber sehr viel weniger als wenn ich wirklich alles doppelt und dreifach schreiben würde.<br />
Dann hab ich noch ne Frage, ich hab irgendwo in der Boost-Doku, genauergesagt hier <a href="http://boost.org/libs/utility/operators.htm#chaining" rel="nofollow">http://boost.org/libs/utility/operators.htm#chaining</a> (ich hab mit boost gerade erst angefangen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> aber es erleichtert doch einiges) gelesen, dass bei manchen Compilern bei Ableitung von Klassen ohne Member die Objektgröße anwächst. Da auch mal große Mengen an Matrizen und Vektoren gespeichert werden sollen wäre das nicht sehr schön. Ist das wirklich so?</p>
</blockquote>
<p>Wenn nicht, stände diese Behauptung dort nicht. Sobald Mehrfachvererbung im Spiel ist, ist diese Objektvergrößerung mitunter erforderlich, weil zwei verschiedene (Sub-)objekte nicht die gleiche Adresse haben können. Für die gewöhnliche einfache Vererbung wird das aber wohl kein Problem sein, wenn dein Compiler nicht von vorgestern ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213378</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 20 Jan 2007 19:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sun, 21 Jan 2007 10:48:40 GMT]]></title><description><![CDATA[<p>So, jetzt habe ich das mit der Vererbung mal ausprobiert und bin jetzt auf einige Compilerfehler gestoßen, aus denen ich absolut nicht schlau werde und die sich ständig verändern, je nachdem, was ich mache.</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
  class basic_matrix
    :public basic_matrix_base&lt;T, m, n&gt;
  {
    public:
    explicit basic_matrix(type);
  };
</code></pre>
<p>Das ist im Moment meine kleine Ableitung. type ist in basic_matrix_base definiert:</p>
<pre><code class="language-cpp">//...
    public:
    enum type
    {
      null,
      identity
    };
    //...
</code></pre>
<p>Eigentlich sehe ich nicht, was da falsch sein soll, ich kriege aber folgendes:</p>
<pre><code>matrix.hpp:89: Fehler: nur Deklarationen von Konstruktoren können »explicit« sein
</code></pre>
<p>Und wenn ich statt &quot;explicit basic_matrix(type)&quot; &quot;explicit basic_matrix(basic_matrix_base&lt;T, m, n&gt;::type);&quot; schreibe noch seltsamer:</p>
<pre><code>matrix.hpp:89: Fehler: Typ »rayce::basic_matrix_base&lt;T, m, n&gt;« ist nicht vom Typ »rayce::basic_matrix&lt;T, m, n&gt;« abgeleitet
</code></pre>
<p>Ich verstehe kein Wort von diesen Fehlermeldung und habe auch schon alles nach fehlenden ; oder Klammern durchsucht, aber nichts gefunden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213563</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Sun, 21 Jan 2007 10:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sun, 21 Jan 2007 13:10:29 GMT]]></title><description><![CDATA[<p>Schau mal wie dein &quot;Konstruktor&quot; heißt und wie die Klasse heißt. Du hast da was vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213681</guid><dc:creator><![CDATA[lolz_ausgeloggt]]></dc:creator><pubDate>Sun, 21 Jan 2007 13:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sun, 21 Jan 2007 13:51:20 GMT]]></title><description><![CDATA[<p>basic_matrix_base&lt;T, m, n&gt; ist eine abhängige Basis. Folglich wird type beim Namelookup nicht gefunden werden (das Thema wird hier mindestens einmal pro Woche durchgenommen). also</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
  class basic_matrix
    :public basic_matrix_base&lt;T, m, n&gt;
  {
    public:
    explicit basic_matrix(typename basic_matrix_base&lt;T, m, n&gt;::type);
  };
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
  class basic_matrix
    :public basic_matrix_base&lt;T, m, n&gt;
  {
    public:
    typedef typename basic_matrix_base&lt;T, m, n&gt;::type type; // die enumkonstanten sind damit noch nicht bekannt
    explicit basic_matrix(type);
  };
</code></pre>
<p>oder (oder auch nicht, hab das noch nie mit typen und using versucht)</p>
<pre><code class="language-cpp">template &lt;typename T, int m, int n&gt;
  class basic_matrix
    :public basic_matrix_base&lt;T, m, n&gt;
  {
    public:
    using basic_matrix_base&lt;T, m, n&gt;::type;
    explicit basic_matrix(typename type);
  };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1213730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213730</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 21 Jan 2007 13:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sun, 21 Jan 2007 15:23:03 GMT]]></title><description><![CDATA[<p>Tut mir leid <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Merkzettel: Templates nur benutzen, falls UNBEDINGT notwendig.<br />
Hab schon typename an alle möglichen Stellen hingeklatscht, da aber noch nicht. Trotzdem doof, dass dadurch die enum-Konstanten nicht bekannt sind, weil mit dem type wollte ich einfaches Konstruieren von Matrizen ermöglichen, die man öfters braucht. Pfff.. in der Zeit hätte ich schon längst ne nicht-Template-Klasse geschrieben und drüber ein typedef für (im Moment noch) double hingeschrieben. Nunja, man lernt nie aus. Vielen Dank, ich werde alle drei Möglichkeiten probieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213794</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Sun, 21 Jan 2007 15:23:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sun, 21 Jan 2007 17:16:01 GMT]]></title><description><![CDATA[<p>Eine Möglichkeit ist, Deklarationen, die keine echte Abhängigkeit von Templateparametern haben und auch nicht an eine bestimmte Instanz gebunden sein sollen, in eine eigene Klasse auszulagern und von dieser (ggf. mehrfach und virtuell) zu erben. So wie ich es sehe, taucht type hier überall gleichermaßen auf ohne dass dieses type für verschiedene Templateklassen etwas anderes bedeutet. Es wäre also z.B. auch denkbar, type außerhalb, evtl. in einem eigenen Namespace zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213883</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 21 Jan 2007 17:16:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Sun, 21 Jan 2007 18:08:13 GMT]]></title><description><![CDATA[<p>Ja, genau das habe ich mir auch schon überlegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213920</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Sun, 21 Jan 2007 18:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 15:32:24 GMT]]></title><description><![CDATA[<p>Ich bins wieder... Jetzt habe ich zwar alles umgebaut, aber das programmieren an dieser Klasse ist nun eine einzige Qual, weil der Compiler JEDESMAL wenn ich innerhalb einer Methode von basic_matrix (spezialisiert) auf eine Methode von basic_matrix_base zugreifen will ich den vollen Namen der Funktion ausschreiben muss, also basic_matrix_base&lt;T, 2, 2&gt;::foo(). Das wird ziemlich schnell unübersichtlich. Ich bin so genervt, dass ich bald die ganze Klasse schrotten werden und eben zwei Klassen für 3x3- und 4x4-Matrizen schreiben werde. Selbst das wird weniger Redundanz als so.<br />
Gibt es im angeblich irgendwann kommenden neuen Standard wenigstens eine Möglichkeit, ein Klassentemplate gleichzeitig zu spezialisieren und zu erweitern? Oder hat jemand eine andere clevere Idee, die etwas schneller umzusetzen ist als der neue Standard? <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="😉"
    /><br />
genervter geloescht</p>
<p>PS: matrix.hpp:108: Fehler: es gibt keine Argumente für »get_data«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »get_data« verfügbar sein muss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215335</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 23 Jan 2007 15:32:24 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 16:36:13 GMT]]></title><description><![CDATA[<p>benutz doch einfach eine using-Deklaration, um den Funktionsnamen bekanntzumachen. Oder schreibt eine kurze inline Funktion, die die geerbte Funktion aufruft. Im neuen Standard könnte man das eleganter durch template typedefs lösen. Dein Problem ist ja, dass die erweiterte Version (für bestimmte Parameter) auf die Grundversion des Templates (mit den selben Parametern) aufbauen soll, und das schließt die unmittelbare Anwendung von Spezialisierung ja aus. Anderseits könnte evtl. die Verwendung eines zusätzlichen Templateparameters mit geeignetem defaultwert helfen. Etwa so:</p>
<pre><code class="language-cpp">template&lt;typename T, int m, int n, bool = (m==3&amp;&amp;n==3) /*hier alle Fälle, die erweitert werden sollen geeignet einschließen)*/&gt;
class basic_matrix; // wird nicht definiert

// erste Spezialisierung, die Grundform:
template&lt;typename T, int m, int n&gt;
class basic_matrix&lt;T, m, n, false&gt;
// ...

// Spezialisierung für 3x3
template&lt;typename T&gt;
class basic_matrix&lt;T, 3, 3, true&gt;
    : public basic_matrix&lt;T, 3, 3, false&gt;
// ...
</code></pre>
<p>Ist systematisch ein bisschen unsauber, spart aber wohl ein wenig code</p>
<p>Zu überlegen wäre auch noch, ob eine Spezialisierung des Templates überhaupt erforderlich ist. Du kannst ja erstens auch dem Primärtemplate zusätzliche Funktionen spendieren, deren Definitionen für nicht passende Templateargumente nicht instantiierbar sind (oder per SFINAE herausfallen) oder du spezialisiert einzelne Funktionen. Das ist aber auf explizite Spezialisierung beschränkt. Die Beschränkung könnte z.B. dadurch umgangen werden, das diese Funktionen selbst einen Funktor aufrufen, diesen wiederum könntest du auch wieder partiell (also für alle T) spezialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215383</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Jan 2007 16:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 16:47:55 GMT]]></title><description><![CDATA[<p>Hmmm, nun, das wird zwar etwas kürzer, aber so richtig zufrieden bin ich damit nicht. Fällt irgendwie unter den Begriff &quot;frickeln&quot; <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="😉"
    /> Ich benutze schon BOOST_STATIC_ASSERT() um Methoden, die nur mit m==n funktionieren zu definieren. Aber die selben Methoden für m==n==3 und m==n==2 müssen ja auch definiert werden und da liegt der Hund begraben. Eigentlich müsste man nur die spezialisieren, aber das geht nicht partiell. Ich kann wirklich nicht glauben, dass da sonst keiner dran gedacht hat. Oder ist meine Matrix-Klasse selbst schrottig? Wie auch immer, ich lasse das mal ruhen und komme wieder darauf zurück, wenn ich Muse habe. Ich finde es aber trotzdem schön, dass du dir Gedanken darüber machst, sonst wäre ich längst zu der Erkenntnis gelangt, dass ich einfach zu blöd dafür bin <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/1215392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215392</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 23 Jan 2007 16:47:55 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 16:53:13 GMT]]></title><description><![CDATA[<p>geloescht schrieb:</p>
<blockquote>
<p>Aber die selben Methoden für m==n==3 und m==n==2 müssen ja auch definiert werden und da liegt der Hund begraben.</p>
</blockquote>
<p>Das geht doch ebenso einfach:</p>
<pre><code class="language-cpp">template&lt;typename T, int n&gt;
class basic_matrix&lt;T, n, n, true&gt;
// ...
</code></pre>
<p>so hast du zwar auch ein template wenn m,n nicht 2 oder 3 ist, aber dieses wird ja dank des bools im Regelfall nicht instantiiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215397</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Jan 2007 16:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 17:06:44 GMT]]></title><description><![CDATA[<p>öhm. Verstehe nicht. Wie kommen dann die zwei Methoden rein? Die sind ja für 2 und drei unterschiedlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215406</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 23 Jan 2007 17:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 17:14:41 GMT]]></title><description><![CDATA[<p>unterscheiden sich die Funktionen nur in ihrer Implementation?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215411</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Jan 2007 17:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 17:15:32 GMT]]></title><description><![CDATA[<p>Ja, und eben in der Klasse, der sie angehören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215412</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 23 Jan 2007 17:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 17:45:28 GMT]]></title><description><![CDATA[<p>geloescht schrieb:</p>
<blockquote>
<p>Ja, und eben in der Klasse, der sie angehören.</p>
</blockquote>
<p>Dann ist das Problem weitaus einfacher zu lösen, als du anfangs dargestellt hast.<br />
per SFINAE:</p>
<pre><code class="language-cpp">template&lt;typename T, int m, int n&gt;
class basic_matrix
{
public:
//    void foo(); wird zu
    typename enable_if_c&lt;m!=m||m!=2&amp;&amp;m!=3,void&gt;::type foo(); // der allgemeine Fall
    typename enable_if_c&lt;m==n&amp;&amp;m==2,void&gt;::type foo(); // m,n == 2
    typename enable_if_c&lt;m==n&amp;&amp;m==3,void&gt;::type foo(); // m,n == 3
// usw.
};
</code></pre>
<p>Es gibt noch ein paar andere Möglichkeiten, das mittes enable_if zu machen , ich verweise dazu auf die <a href="http://www.boost.org/libs/utility/enable_if.html" rel="nofollow">Boost Doku</a></p>
<p>Eine andere Möglichkeit:</p>
<pre><code class="language-cpp">template&lt;typename T, int m, int n&gt;
class basic_matrix
{
private:
    template&lt;typename U=T,int o=m,intp=n&gt; friend class DoFoo;
public:
    void foo() { DoFoo&lt;&gt;()(this); }
};

template&lt;typename T, int m, int n&gt; class basic_matrix::
template&lt;typename U, int o, int p&gt; class DoFoo
{
    void operator()(basic_matrix&lt;T,m,n&gt;*) { /* ... */ }
};

template&lt;typename T, int m, int n&gt; class basic_matrix::
template&lt;&gt; class DoFoo&lt;T,2,2&gt;
// usw.
</code></pre>
<p>Indirektion löst noch (fast) jedes Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215431</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Jan 2007 17:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 18:01:26 GMT]]></title><description><![CDATA[<p>Wahrscheinlich wusste ich nicht, wie ich es anfangs so darstellen konnte, dass man es so lösen könnte <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="😉"
    /><br />
Das eröffnet neue Horizonte für mich. Auch wenn es wirklich seltsam aussieht. Dankeschön. Wenn ich das ganze wie in der Doku vorgeschlagen als Default-Parameter vom Typ void* mache dann wird der Parameter doch hoffentlich rausoptimiert, wenn ich ihn nicht benutze.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215439</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 23 Jan 2007 18:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 18:56:46 GMT]]></title><description><![CDATA[<p>darf ich fragen warum du das nicht einfach mit ner if bedingung löst ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215483</guid><dc:creator><![CDATA[DaRpH]]></dc:creator><pubDate>Tue, 23 Jan 2007 18:56:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Tue, 23 Jan 2007 21:27:13 GMT]]></title><description><![CDATA[<p>Weil Templates zur Compilezeit erstellt werden und ifs zur Laufzeit ausgeführt werden. Außerdem wäre ein if unübersichtlich und etwas langsamer in der Ausführung, was ich nicht will, weil es um ein 3D-Renderingprogramm geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215592</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 23 Jan 2007 21:27:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate: Nur einzelne Methoden spezialisieren on Wed, 24 Jan 2007 09:25:23 GMT]]></title><description><![CDATA[<p>Ob das jetzt für dich sinnvoll ist oder nicht sei mal dahingstellt, dennoch es ist durchaus möglich relativ leicht if-Statments mit Hilfe von Templates nachzubilden.</p>
<p>Hier mal ein Beispiel von: <a href="http://www.lrz-muenchen.de/~ebner/C++/Slides/cxxkurs.html" rel="nofollow">http://www.lrz-muenchen.de/~ebner/C++/Slides/cxxkurs.html</a></p>
<pre><code class="language-cpp">// Klassendeklaration:
template&lt;bool C&gt;
class IfThen { };

// Spezialisierung für beide Fälle
class IfThen&lt;true&gt; {
  public:
    static inline void f()
    { statement1; }
};

class IfThen&lt;false&gt; {
  public:
    static inline void f()
    { statement2; }
};

// Ersatz des 'if/else'-Statements:
IfThen&lt;condition&gt;::f();
</code></pre>
<p>Gruß Baracke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215765</guid><dc:creator><![CDATA[Baracke]]></dc:creator><pubDate>Wed, 24 Jan 2007 09:25:23 GMT</pubDate></item></channel></rss>