<?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[Template Spezialisierung]]></title><description><![CDATA[<p>Hi, ich habe folgendes Problem:<br />
Ich habe eine Klasse Vektor, mit den Methoden Add, operator+, Subtract, ... .<br />
Diese Klasse ist ein Template, so das man n-dimensional Vektoren erzeugen kann (Vektor&lt;n&gt; x)<br />
Jetzt möchte ich aber für 3-Dimensional Vektoren eine bestimmte Methode haben, aber die anderen Methoden beibehalten. Ich habe es schon mit</p>
<pre><code class="language-cpp">//Vektor Klasse algemein
template &lt;int n&gt;
class Vektor {
//... Add(), Subtract(), ...
};

//Vektor Klasse spezialisiert
template &lt;&gt;
class Vektor&lt;3&gt; {
//... X(), Y(), Z(), ...
}
</code></pre>
<p>probiert, aber dann gehen die Methoden Subtract, Add, ... , die ich nur in dem allgemeinem Vektor definiert habe verloren. Ich möchte aber nicht nochmal das selbe für 3-Dimensionale Vektoren schreiben, sondern nur ein paar Methoden hinzufügen, die alten aber beibehalten.</p>
<p>Ich hoffe das war Verständlich <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/296246/template-spezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 00:04:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296246.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Nov 2011 16:29:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 16:29:23 GMT]]></title><description><![CDATA[<p>Hi, ich habe folgendes Problem:<br />
Ich habe eine Klasse Vektor, mit den Methoden Add, operator+, Subtract, ... .<br />
Diese Klasse ist ein Template, so das man n-dimensional Vektoren erzeugen kann (Vektor&lt;n&gt; x)<br />
Jetzt möchte ich aber für 3-Dimensional Vektoren eine bestimmte Methode haben, aber die anderen Methoden beibehalten. Ich habe es schon mit</p>
<pre><code class="language-cpp">//Vektor Klasse algemein
template &lt;int n&gt;
class Vektor {
//... Add(), Subtract(), ...
};

//Vektor Klasse spezialisiert
template &lt;&gt;
class Vektor&lt;3&gt; {
//... X(), Y(), Z(), ...
}
</code></pre>
<p>probiert, aber dann gehen die Methoden Subtract, Add, ... , die ich nur in dem allgemeinem Vektor definiert habe verloren. Ich möchte aber nicht nochmal das selbe für 3-Dimensionale Vektoren schreiben, sondern nur ein paar Methoden hinzufügen, die alten aber beibehalten.</p>
<p>Ich hoffe das war Verständlich <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/2151141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151141</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 16:55:51 GMT]]></title><description><![CDATA[<p>hola</p>
<p>vielleicht so:</p>
<pre><code class="language-cpp">//Vektor Klasse algemein
template &lt;int n&gt;
class Vektor {
//... Add(), Subtract(), ...
   ret_value nur_fuer_3(param p);
};

/* ausserhalb der klasse */
template&lt;&gt;
ret_value Vector&lt;3&gt;::nur_fuer_3(param p)
{
   mach_was();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2151154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151154</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 16:58:46 GMT]]></title><description><![CDATA[<p>Lösung 1: Gemeinsame Funktionalität in Basisklasse auslagern. Allgemeines Template und spezialisiertes Template erben von dieser.<br />
Lösung 2: Vielleicht tun ja auch freie Funktionen das was du möchtest. So etwas wie Kreuzprodukt ist beispielsweise eher als freie Operation auf Vektoren der Länge 3 anzusehen, anstatt einer Funktion die ein Vektor mit sich selbst durchführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151158</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 17:01:26 GMT]]></title><description><![CDATA[<p>Ich hatte das gleiche Problem und leider habe ich als Lösung nur Vererbung gefunden. (Ging konkret um einen Konstruktor.)<br />
Wäre mit variadic Templates vielleicht sogar anders möglich, aber solange MS das nicht unterstützt.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151159</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 30 Nov 2011 17:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 17:06:13 GMT]]></title><description><![CDATA[<p>Ich bin grade etwas ratlos, um ehrlich zu sein. Folgende Ansätze hätte ich:</p>
<ol>
<li>Deklariere die Methoden im allgemeinen Template, implementiere sie nur für Vector&lt;3&gt; (so wie MeepMeep, allerdings mit SFINAE gewürzt)</li>
</ol>
<pre><code class="language-cpp">//Vektor Klasse algemein
template &lt;int n&gt;
class Vektor {
//... Add(), Subtract(), ...
   template &lt;class = enable_if&lt;n==3, void&gt;::type&gt;
   void nur_fuer_3(param p);
};

/* ausserhalb der klasse */
template&lt;&gt;
template&lt;&gt;
void Vector&lt;3&gt;::nur_fuer_3&lt;void&gt;(param p)
{
   /* ... */;
}
</code></pre>
<ol start="2">
<li>Verlagere die gemeinsamen Dinge in ein Basisklassentemplate:</li>
</ol>
<pre><code class="language-cpp">template &lt;int N&gt;
struct VektorImpl
{
//... Add(), Subtract(), ...
};

template &lt;int N&gt;
class Vektor : VektorImpl&lt;N&gt;
{};

template &lt;&gt;
class Vektor&lt;3&gt; : VektorImpl&lt;3&gt;
{
  void nur_fuer_3(param p) {/* ... */};
};
</code></pre>
<p>(Ohne Gewähr, ungetestet)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151162</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 30 Nov 2011 17:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 17:07:31 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Ich hatte das gleiche Problem und leider habe ich als Lösung nur Vererbung gefunden. (Ging konkret um einen Konstruktor.)</p>
</blockquote>
<p>Das ist philosophisch aber durchaus richtig. Eine Spezialisierung beschreibt eine andere Umsetzung, Vererbung beschreibt eine Erweiterung. Hier soll Funktionalität hinzu gefügt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151163</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 30 Nov 2011 17:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 17:15:18 GMT]]></title><description><![CDATA[<p>Das mit der Basis Klasse habe ich schon probiert. Problem:<br />
Ich möchte ja in Subtract, Add, ... einen Vektor und keinen VektorBase zurückgeben. Wenn ich aber dann schreibe</p>
<pre><code class="language-cpp">template &lt;unsigned int n&gt;
Vektor&amp; VektorBase&lt;n&gt;::operator/=(float x) {
// ...
return *this;
}
</code></pre>
<p>geht das ja nicht ...</p>
<p>Das mit den freien Methoden ist mir auch eingefallen nachdem ich den Thread geöffnet hatte, werde ich mal probieren <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="🙂"
    /> Dann sollte das ja ganze einfach sein</p>
<p>Meinst du mit Veerbung sowas wie Vektor -&gt; Vektor3D ? Ist aber schöner wenn man Vektor&lt;3&gt; anstelle von Vektor3D schreiben kann und trotzdem die speziellen Methoden bekommt <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/2151166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151166</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 30 Nov 2011 17:15:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Wed, 30 Nov 2011 18:15:01 GMT]]></title><description><![CDATA[<p>Die allgemeinen Methoden des Vektors kann man schön generisch implementieren.<br />
Statt Spezialisierung würde ich lieber eine freie Funktion nehmen.</p>
<pre><code class="language-cpp">#include &lt;boost/array.hpp&gt;
#include &lt;boost/static_assert.hpp&gt;

template &lt;class E, size_t N&gt;
struct vector
{
	boost::array&lt;E, N&gt; elements;

	void add(const vector &amp;other)
	{
		for (size_t i = 0; i &lt; N; ++i)
		{
			elements[i] += other.elements[i];
		}
	}
};

template &lt;size_t Index&gt;
struct accessor
{
	template &lt;class E, size_t N&gt;
	E &amp;operator()(vector&lt;E, N&gt; &amp;v)
	{
		BOOST_STATIC_ASSERT(Index &lt; N);
		return v.elements[Index];
	}
};

static accessor&lt;0&gt; x;
static accessor&lt;1&gt; y;
static accessor&lt;2&gt; z;

template &lt;class E&gt;
void super_special_method(vector&lt;E, 3&gt; &amp;v)
{
}

int main()
{
	vector&lt;double, 3&gt; v;
	x(v) = 12;
	y(v) = 6;
	z(v) = 3;

	super_special_method(v);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2151185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151185</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 30 Nov 2011 18:15:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template Spezialisierung on Fri, 02 Dec 2011 18:18:08 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Das mit der Basis Klasse habe ich schon probiert. Problem:<br />
Ich möchte ja in Subtract, Add, ... einen Vektor und keinen VektorBase zurückgeben. Wenn ich aber dann schreibe</p>
<pre><code class="language-cpp">template &lt;unsigned int n&gt;
Vektor&amp; VektorBase&lt;n&gt;::operator/=(float x) {
// ...
return *this;
}
</code></pre>
<p>geht das ja nicht ...</p>
</blockquote>
<p>Vererben, dazu ein paar freie Funktionen. Funktioniert schon.<br />
Aber naja, ich habe seit Jahren kein C++ mehr programmiert ... hoffe mal es ist nicht zu katastrophal <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
//using namespace std;

#ifndef VECTORN_H
#define VECTORN_H

namespace Mathematics
{
	template&lt;typename T, int N&gt;
		class Vector;

	template&lt;typename T, int N&gt;
		class VectorBase
		{
			protected:
				T data[N];

				VectorBase()
				: data()
				{}

			public:
				T Sum() const;
				T&amp; operator[](int index);
				const T&amp; operator[](int index) const;

				template&lt;typename T, int N&gt;
				friend Vector&lt;T,N&gt;&amp; operator+=(Vector&lt;T,N&gt;&amp; a, Vector&lt;T,N&gt; const&amp; b);
		};

	template&lt;typename T, int N&gt;
		T VectorBase&lt;T,N&gt;::Sum() const
		{
			T sum = 0;
			for(int i=0; i&lt;N; ++i)
				sum+=data[i];

			return sum;
		}

	template&lt;typename T, int N&gt;
		T&amp; VectorBase&lt;T,N&gt;::operator[](int index)
		{
			return data[index];
		}

	template&lt;typename T, int N&gt;
		const T&amp; VectorBase&lt;T,N&gt;::operator[](int index) const
		{
			return data[index];
		}

	template&lt;typename T, int N&gt;
		std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, VectorBase&lt;T,N&gt; const&amp; vec)
		{
			out&lt;&lt;&quot;(&quot;;
			for(int i=0;i&lt;N;++i)
				out&lt;&lt;vec[i]&lt;&lt;(i&lt;N-1?&quot;,&quot;:&quot;)&quot;);
			return out;
		}

	template&lt;typename T, int N&gt;
		class Vector : public VectorBase&lt;T,N&gt;
		{
			public:
				Vector()
				{}
		};

	template&lt;typename T&gt;
		class Vector&lt;T,3&gt; : public VectorBase&lt;T,3&gt;
		{
			public:
				T&amp; X;
				T&amp; Y;
				T&amp; Z;

				Vector()
					: X(this-&gt;data[0]), Y(this-&gt;data[1]), Z(this-&gt;data[2])
				{}

				Vector(T x, T y, T z)
					: X(this-&gt;data[0] = x), Y(this-&gt;data[1] = y), Z(this-&gt;data[2] = z)
				{}

				static Vector&lt;T,3&gt; Cross(const Vector&lt;T,3&gt;&amp; a, const Vector&lt;T,3&gt;&amp; b)
				{

					return Vector (
									a.Y*b.Z - a.Z*b.Y,
									a.Z*b.X - a.X*b.Z,
									a.X*b.Y - a.Y*b.X
  								  );
				}
		};

	template&lt;typename T, int N&gt;
		Vector&lt;T,N&gt;&amp; operator+=(Vector&lt;T,N&gt;&amp; a, Vector&lt;T,N&gt; const&amp; b)
		{
			for(int i=0; i&lt;N; ++i)
				a.data[i]+=b.data[i];
			return a;
		}

	template&lt;typename T, int N&gt;
		const Vector&lt;T,N&gt; operator+(Vector&lt;T,N&gt; const&amp; a, Vector&lt;T,N&gt; const&amp; b)
		{
			Vector&lt;T,N&gt; tmp(a);
			tmp+=b;
			return tmp;
		}
}

#endif // VECTORN_H
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2152037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2152037</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Dec 2011 18:18:08 GMT</pubDate></item></channel></rss>