<?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[Vektor-Klasse]]></title><description><![CDATA[<p>Hallo!</p>
<p>Eines vorwerg: hierbei handelt es sich um eine Designfrage, kein Implementierungsproblem.</p>
<p>Ich habe eine Vektor-Klasse implementiert (im streng mathematischen Sinne, nicht einen Objekt-Container). Momentan verwendet sich intern ein float-Array. Diese Klasse gibt es nun 3 Mal: für 2-, 3- und 4-wertige Vektoren.</p>
<p>Jetzt brauche ich sie auch für Integer-Daten. Eine naheliegende Lösung wäre es daher, ein Template zu machen. Daran gefällt mir allerdings nicht, dass dann die Implementierungen der Funktionen (hauptsächlich Operatoren) alle in die Headerdatei verschoben werden müssen (was selbige sehr groß und unübersichtlich macht), da der Linker ja Probleme damit hat wenn sich der Code für Templates in der cpp befindet.</p>
<p>Alternativ könnte ich natürlich alle 3 Größen von Vektoren für die 2 Typen separat implementieren. Das ist aber kein besonders professionelles Design.</p>
<p>Wie würdet ihr diese Klassen designen? Am besten wäre es natürlich wenn man überhaupt nur eine Vektor-Klasse hätte, aber ich will auch nicht Speicher für 4 Elemente belegen, wenn dann vielleicht eh nur 2 verwendet werden.</p>
<p>Danke schonmal!</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/143104/vektor-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 03:07:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143104.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Apr 2006 14:12:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vektor-Klasse on Wed, 05 Apr 2006 14:12:07 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Eines vorwerg: hierbei handelt es sich um eine Designfrage, kein Implementierungsproblem.</p>
<p>Ich habe eine Vektor-Klasse implementiert (im streng mathematischen Sinne, nicht einen Objekt-Container). Momentan verwendet sich intern ein float-Array. Diese Klasse gibt es nun 3 Mal: für 2-, 3- und 4-wertige Vektoren.</p>
<p>Jetzt brauche ich sie auch für Integer-Daten. Eine naheliegende Lösung wäre es daher, ein Template zu machen. Daran gefällt mir allerdings nicht, dass dann die Implementierungen der Funktionen (hauptsächlich Operatoren) alle in die Headerdatei verschoben werden müssen (was selbige sehr groß und unübersichtlich macht), da der Linker ja Probleme damit hat wenn sich der Code für Templates in der cpp befindet.</p>
<p>Alternativ könnte ich natürlich alle 3 Größen von Vektoren für die 2 Typen separat implementieren. Das ist aber kein besonders professionelles Design.</p>
<p>Wie würdet ihr diese Klassen designen? Am besten wäre es natürlich wenn man überhaupt nur eine Vektor-Klasse hätte, aber ich will auch nicht Speicher für 4 Elemente belegen, wenn dann vielleicht eh nur 2 verwendet werden.</p>
<p>Danke schonmal!</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031135</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Wed, 05 Apr 2006 14:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor-Klasse on Wed, 05 Apr 2006 14:25:41 GMT]]></title><description><![CDATA[<p>Templates -&gt; Keine .cpp Datei für die Vektorklassen benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031146</guid><dc:creator><![CDATA[ssdsdsd]]></dc:creator><pubDate>Wed, 05 Apr 2006 14:25:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor-Klasse on Wed, 05 Apr 2006 14:45:47 GMT]]></title><description><![CDATA[<p>vorschlag</p>
<pre><code class="language-cpp">template&lt;
	typename T_, // datentyp
	unsigned n&gt; // 2, 3, 4, usw
class Vector
{
	private:
		T_	val[n];

	public:
};

#include &quot;vector.inl&quot; // implementierung
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1031161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031161</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Wed, 05 Apr 2006 14:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor-Klasse on Wed, 05 Apr 2006 19:45:00 GMT]]></title><description><![CDATA[<p>Der Vorschlag lag irgendwie auf der Hand. Und jetzt wird's spannend. Zum Bespiel Das Skalarprodukt für eine 2D-Vektor sieht wohl so aus:</p>
<pre><code class="language-cpp">T_ operator*( const Vektor2D&amp; b ) const
    {
        return va[0] * b.val[0] + val[1] * b.val[1];
    }
</code></pre>
<p>und die Verallgemeinerung mit N konsequenterweise</p>
<pre><code class="language-cpp">T_ operator*( const Vektor&amp; b ) const
    {
        return std::inner_produkt( val, val + N, b.val, T() );
    }
</code></pre>
<p>Jetzt kommen die Rufe aus der Performance-Ecke, die Schleife in <em>inner_product</em> ist doch viel langsamer als wenn man die Summe direkt hinschreibt. Es müßte doch irgendwie so was gehen:</p>
<pre><code class="language-cpp">T_ operator*( const Vektor&amp; b ) const
    {
        return va[0] * b.val[0] + val[1] * b.val[1] 
            + WENN( N &gt; 2 )( val[2] * b.val[2] ) + WENN( N &gt; 3 )( val[3] * b.val[3] );
    }
</code></pre>
<p>Frage an die Experten: wie setzt man das WENN mit boost::mpl &amp; Co derart um, dass der Compiler in Abhängigkeit von N immer einen Summen-Ausdruck wie beim 2D-Vektor erzeugt?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031402</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 05 Apr 2006 19:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor-Klasse on Wed, 05 Apr 2006 20:00:50 GMT]]></title><description><![CDATA[<p><a href="http://medialab.di.unipi.it/web/AP/MetaProgramming.ppt" rel="nofollow">Hier</a> findet man etwas zu diesem Thema. Einfach ein wenig nach unten scrollen... siehe da: Loop unrolling. Verstehe es zwar selbst noch nicht ganz, wird aber hoffentlich noch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031409</guid><dc:creator><![CDATA[Gideon]]></dc:creator><pubDate>Wed, 05 Apr 2006 20:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor-Klasse on Wed, 05 Apr 2006 22:02:39 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Frage an die Experten: wie setzt man das WENN mit boost::mpl &amp; Co derart um, dass der Compiler in Abhängigkeit von N immer einen Summen-Ausdruck wie beim 2D-Vektor erzeugt?</p>
</blockquote>
<p>Wie Gideon schon andeutete, das Stichwort heisst Loop-Unrolling. Wie es mit boost::mpl funktioniert, kann ich dir allerdings nicht sagen, da ich solch triviale Sachen wie im Beispiel idR direkt implementiere. Vom Prinzip her funktioniert das wie folgt:</p>
<pre><code class="language-cpp">template &lt;unsigned int I&gt;
struct unroller // Klasse mit Funktion, die sozusagen fuer einen Schleifendurchlauf steht
{
    template &lt;class T&gt;
    static void makeitso(const T* val, const T* val2)
    {
        return *val * *val2 + unroller&lt;I - 1&gt;::makeitso(val + 1, val2 + 1);
    }
};

template &lt;&gt;
struct unroller&lt;1&gt; // Spezialisierung fuer das Ende des Loops (Vorsicht: unroller nicht mit 0 aufrufen oder halt eine Spezialisierung fuer unroller&lt;0&gt; machen)
{
    template &lt;class T&gt;
    static void makeitso(const T* val, const T* val2)
    {
        return *val + *val2;
    }
};

T_ operator*( const Vektor&amp; b ) const
{
    return unroller&lt;N&gt;::makeitso(val, b.val);
}
</code></pre>
<p>Für Meta Loop-Unrolling muss man sich natürlich darauf verlassen, dass der Compiler die Funktionen inlined. Und die Funktionen brauchst du, sofern du Parameter hast, welche du nicht als Template Parameter der Klasse übergeben kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031473</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 05 Apr 2006 22:02:39 GMT</pubDate></item></channel></rss>