<?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[Zusätzlicher Konstruktor durch Partielle Spezialisierung]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T, int size&gt;
struct vec
{
	T v[size];

	T getLength()
	{
		return 1;
	}
};

template&lt;typename T&gt;
struct vec&lt;T, 3&gt;
{
	vec()
	{
	}
	vec(T x, T y, T z)
	{
	}
};

typedef vec&lt;float, 2&gt; vec2f;
typedef vec&lt;float, 3&gt; vec3f;
typedef vec&lt;float, 4&gt; vec4f;
</code></pre>
<p>ich will das mein vec3f zusätzlich zu den üblichen Methoden die ein vec anbietet auch noch zwei Konstruktoren bereit stellt.</p>
<p>folgendes sollte möglich sein:</p>
<pre><code class="language-cpp">vec3f t(7,8,1);
t.getLength();
</code></pre>
<p>geht aber nicht weil Compiler meint:</p>
<pre><code>'getLength' : is not a member of 'vec&lt;T,size&gt;'
</code></pre>
<p>das ist doch ganz schön blöde wenn ich jetzt nochmal alle Methoden von vec in der partiellen Spezialisierung von vec&lt;T,3&gt; noch mal neu programmieren muss - kann ich nicht einfach die ganze Funktionalität von vec haben und zusätzlich einfach noch die zwei Konstruktoren - ich habe versucht von vec zu erben - aber funzt nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308764/zusätzlicher-konstruktor-durch-partielle-spezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 15:18:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308764.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Oct 2012 22:56:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Thu, 04 Oct 2012 22:56:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T, int size&gt;
struct vec
{
	T v[size];

	T getLength()
	{
		return 1;
	}
};

template&lt;typename T&gt;
struct vec&lt;T, 3&gt;
{
	vec()
	{
	}
	vec(T x, T y, T z)
	{
	}
};

typedef vec&lt;float, 2&gt; vec2f;
typedef vec&lt;float, 3&gt; vec3f;
typedef vec&lt;float, 4&gt; vec4f;
</code></pre>
<p>ich will das mein vec3f zusätzlich zu den üblichen Methoden die ein vec anbietet auch noch zwei Konstruktoren bereit stellt.</p>
<p>folgendes sollte möglich sein:</p>
<pre><code class="language-cpp">vec3f t(7,8,1);
t.getLength();
</code></pre>
<p>geht aber nicht weil Compiler meint:</p>
<pre><code>'getLength' : is not a member of 'vec&lt;T,size&gt;'
</code></pre>
<p>das ist doch ganz schön blöde wenn ich jetzt nochmal alle Methoden von vec in der partiellen Spezialisierung von vec&lt;T,3&gt; noch mal neu programmieren muss - kann ich nicht einfach die ganze Funktionalität von vec haben und zusätzlich einfach noch die zwei Konstruktoren - ich habe versucht von vec zu erben - aber funzt nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257194</guid><dc:creator><![CDATA[alapasta87]]></dc:creator><pubDate>Thu, 04 Oct 2012 22:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 07:59:53 GMT]]></title><description><![CDATA[<p>Muss aber funzen. Die Signaturen der Konstruktoren hängen (selbstverständlich) von der <strong>Deklaration in der Klasse</strong> ab. D. h., entweder du spezialisierst die gesamte Klasse, oder du leitest ab (schlauer) und spezialisierst die Ableitung.</p>
<p>Ich probier gleich ein wenig mit Ableitung rum. Warte mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257230</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 07:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 13:11:30 GMT]]></title><description><![CDATA[<p>Na wieso, geht doch wunderbar:</p>
<pre><code class="language-cpp">template&lt;typename T, int size&gt;
struct base_vec
{
    T v[size];

    virtual T getLength()
    {
        return 1;
    }
};

template&lt;typename T, int size&gt;
struct vec : public base_vec&lt;T, size&gt; ///Das Klassentemplate
{
};

template&lt;typename T&gt;
struct vec&lt;T, 3&gt; : public base_vec&lt;T, 1&gt; ///Spezialisierung
{
    vec(){}
    vec(T , T, T){}
};
</code></pre>
<p><strong>Ideone</strong>: <a href="http://ideone.com/0Pphs" rel="nofollow">http://ideone.com/0Pphs</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257236</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 13:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 10:04:50 GMT]]></title><description><![CDATA[<p>Soll vec für size!=3 ein Aggregat sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257282</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 05 Oct 2012 10:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 11:34:43 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Soll vec für size!=3 ein Aggregat sein?</p>
</blockquote>
<p>Ja, irgendwie sehe ich hier keinen Sinn. Das ist doch vom Design her total verkorkst.</p>
<p>Ich meine, eigentlich sollte man doch Klassentemplates nie Spezialisieren, mir ist noch nie ein gutes Beispiel begegnet <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/2257303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257303</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 11:34:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 11:42:03 GMT]]></title><description><![CDATA[<p>Wenn du C++11 verwenden kannst, kannst du gleich eine allgemeine Vektorklasse schreiben, die das für alle Grössen kann.</p>
<pre><code class="language-cpp">template &lt;typename T, unsigned S&gt;
struct vec {
  T v[S];

  T const* begin() const { return v; }
  T const* end()   const { return v+S; }

  auto length() const -&gt; decltype(std::sqrt(std::declval&lt;T&gt;()))
  {
    auto square = [](T const&amp; a, T const&amp; b){return a+b*b;};
    T sum_of_squares = std::accumulate(begin(), end(), T{}, square);
    return std::sqrt(sum_of_squares);
  }
};

int main()
{
  vec&lt;int, 3&gt; v = {{2,1,2}};
  std::cout &lt;&lt; v.length() &lt;&lt; '\n';

  vec&lt;int, 2&gt; v2 = {{6,8}};
  std::cout &lt;&lt; v2.length() &lt;&lt; '\n';
}
</code></pre>
<p><a href="http://ideone.com/P61fX" rel="nofollow">http://ideone.com/P61fX</a></p>
<p>BTW: Lol Sone, immerhin merkst du selber dass dein Code keinen Sinn hat.<br />
Wobei man auch bei meinem Code aufpassen muss, da vec jetzt immer in einem Aggregatzustand ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257304</guid><dc:creator><![CDATA[korkenzieher]]></dc:creator><pubDate>Fri, 05 Oct 2012 11:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 12:02:51 GMT]]></title><description><![CDATA[<p>.<br />
Mein Code ist auf seine Frage eingegangen, der Sinn sei mal dahingestellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257310</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 12:02:51 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 13:09:39 GMT]]></title><description><![CDATA[<p>Dass <code>vec</code> eine n-dimensionale Koordinate repräsentiert, hat auch keiner gesagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257314</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 13:09:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 12:59:34 GMT]]></title><description><![CDATA[<p>Also dass vec für Vektor steht, sollte klar sein. Und ein Vektor ist stets in einem Vektorraum, von daher finde ich den Einwand sehr fragwürdig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257336</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 05 Oct 2012 12:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 13:08:44 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Also dass vec für Vektor steht, sollte klar sein. Und ein Vektor ist stets in einem Vektorraum, von daher finde ich den Einwand sehr fragwürdig.</p>
</blockquote>
<p>Nein, ein Vektor ist einfach eine Ansammlung von Werten. Diese können dann entsprechend Interpretiert werden (bspw. als Array/Liste von Werten, als Koordinaten, usw. usw.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257342</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 13:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 13:09:50 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Na wieso, geht doch wunderbar:</p>
<pre><code class="language-cpp">virtual ~base_vec(){}
</code></pre>
</blockquote>
<p><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="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257343</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 05 Oct 2012 13:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 13:12:11 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Na wieso, geht doch wunderbar:</p>
<pre><code class="language-cpp">virtual ~base_vec(){}
</code></pre>
</blockquote>
<p><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="🙄"
    /></p>
</blockquote>
<p>Ja, das ist Bullshit. Editiert.</p>
<p>Der TE müsste sich jetzt langsam mal melden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257344</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 05 Oct 2012 13:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zusätzlicher Konstruktor durch Partielle Spezialisierung on Fri, 05 Oct 2012 14:00:36 GMT]]></title><description><![CDATA[<p>Variante, bei der das allgemeine Template ein Aggregat bleibt.</p>
<pre><code class="language-cpp">template &lt;typename T, std::size_t N&gt;
struct vec_generic
{
    T v[N];
...
};

template &lt;typename T&gt;
struct vec3 : vec_generic&lt;T, 3&gt;
{
    vec3();
    vec3(T, T, T);
...
};

template &lt;typename T, std::size_t N&gt;
struct vec_
{
    typedef vec_generic&lt;T, N&gt; type;
};

template &lt;typename T&gt;
struct vec_&lt;T, 3&gt;
{
    typedef vec3&lt;T&gt; type;
};
</code></pre>
<p>Verwendung dann mit vec_&lt;T,N&gt;::type oder wenn Aliastemplates zur Verfügung stehen:</p>
<pre><code class="language-cpp">template &lt;typename T, std::size_t N&gt;
using vec = vec_&lt;T, N&gt;::type;
</code></pre>
<p>Optionaler Konstruktor:</p>
<pre><code class="language-cpp">template &lt;typename T, std::size_t N&gt;
struct vec
{
    T v[N];
    vec();
    template &lt;typename U, typename V, typename W&gt;
    vec(U, V, W, typename boost::enable_if&lt;typename boost::mpl::and_&lt;boost::mpl::bool_&lt;boost::is_convertible&lt;U, T&gt;::type::value
                                                                                    &amp;&amp; boost::is_convertible&lt;V, T&gt;::type::value
                                                                                    &amp;&amp; boost::is_convertible&lt;W, T&gt;::type::value&gt;, boost::mpl::bool_&lt;N==3&gt;&gt;::type&gt;::type* = 0);

// mit C++11
    template &lt;std::size_t I = N, typename std::enable_if&lt;I==3, int&gt;::type = 0&gt;
    vec(T, T, T);

// mit C++11 allgemein
    template &lt;typename... U, typename std::enable_if&lt;sizeof...(U)==N, int&gt;::type = 0&gt;
    vec(U&amp;&amp;... u) : v{ std::forward&lt;U&gt;(u)... } {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2257358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257358</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 05 Oct 2012 14:00:36 GMT</pubDate></item></channel></rss>