<?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: Klasse je nach Typ teilweise übersetzen?]]></title><description><![CDATA[<p>Hallo! :xmas2:<br />
Ein Besipiel:</p>
<pre><code class="language-cpp">template&lt;class T, const int n&gt;
struct foo
{
    foo(T a=1, T b=2);        //Wenn n&lt;=2
    foo(T a=1, T b=2, T c=3); //Wenn n&gt;=3

    T dat;
};
</code></pre>
<p>die beiden konstruktoren überlappen sich ja, da sie Standardargumente besitzen. Ist es nun irgendwie möglich dass für (beispielsweise) foo&lt;double, 2&gt; nur der erste und für foo&lt;double, 3&gt; der letzte konstruktor übersetzt wird?</p>
<p>Danke :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199972/template-klasse-je-nach-typ-teilweise-übersetzen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 23:52:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199972.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Dec 2007 09:50:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 09:50:22 GMT]]></title><description><![CDATA[<p>Hallo! :xmas2:<br />
Ein Besipiel:</p>
<pre><code class="language-cpp">template&lt;class T, const int n&gt;
struct foo
{
    foo(T a=1, T b=2);        //Wenn n&lt;=2
    foo(T a=1, T b=2, T c=3); //Wenn n&gt;=3

    T dat;
};
</code></pre>
<p>die beiden konstruktoren überlappen sich ja, da sie Standardargumente besitzen. Ist es nun irgendwie möglich dass für (beispielsweise) foo&lt;double, 2&gt; nur der erste und für foo&lt;double, 3&gt; der letzte konstruktor übersetzt wird?</p>
<p>Danke :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417431</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Sun, 09 Dec 2007 09:50:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:11:01 GMT]]></title><description><![CDATA[<p>nein, da es die template idee von c++ nicht hergibt, dass du mittels parameter die richtigen funktionen auswählen kannst und so dein compiler die beiden ctor-varianten nicht unterscheiden kann, solange du nur 2 argumente angibst. danach könnte er, er wird sich aber vorher schon beschweren.</p>
<p>:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417436</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:13:56 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>nein, da dein compiler die beiden ctor-varianten nicht unterscheiden kann, solange du nur 2 argumente angibst. danach könnte er, er wird sich aber vorher schon beschweren.</p>
<p>:xmas2:</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> Geht da nicht irgendwas mit Makros? Oder irgendwelche anderen Lösungsmöglichkeiten? :xmas1:</p>
<p>//Edit:<br />
Nein, ich meinte eigendlich dass C++ niemals in den Konflikt kommt zwischen den beiden auszuwählen, da vll Makros(? <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="😃"
    /> :xmas1: <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="😃"
    /> ??) den nicht gebrauchten einfach eleminieren <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="😃"
    /> ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417439</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:14:08 GMT]]></title><description><![CDATA[<p>mit makros kann man so etwas bauen. allerdings geht das nicht auf basis der templateargumente. der präprozessor agiert auf textersetzungsbasis und kommt vor dem eigentliche compiler, der aber erst ahnung von templates hat. :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417441</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:15:23 GMT]]></title><description><![CDATA[<p>Du kannst das Template partiell spezialisieren - das wird in der Regel nicht praktikabel sein, denn das führt zu viel Duplizität. Oder aber in Abhängigkeit der Templateparameter nur bestimmte Überladungen zulassen - Stichwort SFINAE.<br />
z.B.</p>
<pre><code class="language-cpp">template&lt;class T, const int n&gt;
struct foo
{
    foo(typename enable_if_c&lt; (n &lt;= 2), T &gt;::type a=1, T b=2);
    foo(typename enable_if_c&lt; (n &gt; 2),  T &gt;::type a=1, T b=2, T c=3);

    T dat;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1417442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417442</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:18:40 GMT]]></title><description><![CDATA[<p>Meine Klasse ist nur vernünftig zu benutzen wenn es diese konstruktoren gibt... bleibt mir also nichts anderes übrig als die klasse x mal zu kopieren für die verschiedenen &quot;n&quot;?</p>
<p>//Edit: campers beitrag bedarf einiger bedenkzeit für mich ^^ (noch nie was von gehört) .. danke erstmal für die bisherigen antworten! :xmas1: :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417443</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:18:40 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:20:27 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a> <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="😮"
    /> wieder was gelernt.<br />
:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417444</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 10:52:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>... sehr interessant! Ty! ABER ... <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="😉"
    /> ... warum geht das nicht so?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/utility/enable_if.hpp&gt;
using namespace std;

template&lt;class T, const int n&gt;
class foo
{
public:
        foo(typename boost::enable_if_c&lt;(n == 2), T&gt;::type a=1, T b=2){
                dat[0]=a; dat[1]=b;
                cout &lt;&lt; &quot;n==2&quot; &lt;&lt; endl;
        }
        foo(typename boost::enable_if_c&lt;(n &gt; 2), T&gt;::type a=1, T b=2, T c=3){
                dat[0]=a; dat[1]=b; dat[2]=c;
                cout &lt;&lt; &quot;n==3&quot; &lt;&lt; endl;
        }

        void print(){
                for(int i=0; i&lt;n; i++) cout &lt;&lt; dat[i] &lt;&lt; &quot; &quot;;
                cout &lt;&lt; endl;
        }

        T dat[n];
};

typedef foo&lt;int, 2&gt; foo2i;
//typedef foo&lt;int, 3&gt; foo3i;

int main()
{
        foo2i v(4,9);
        v.print();
//      foo3i w;
}
</code></pre>
<p>Wenn der zweite konstruktor nicht auskommentiert ist, lässt sich nichts kompilieren:</p>
<blockquote>
<p>boost.cpp: In instantiation of »foo&lt;int, 2&gt;«:<br />
boost.cpp:31: instantiated from here<br />
boost.cpp:13: Fehler: kein Typ namens »type« in »struct boost::enable_if_c&lt;false, int&gt;«</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1417464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417464</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Sun, 09 Dec 2007 10:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 13:33:26 GMT]]></title><description><![CDATA[<p>Weil ich immer wieder den gleichen Fehler mache. SFINAE erlaubt es, aus einem Überladungsset diejenigen Templates zu eliminieren, die für die gegebenen/deduzierten Templateparameter nicht instantiierbar ist. Die Konstruktoren hier sind aber keine Templates, sondern gewöhnliche Funktionen - dass sie selbst Member eines Klassentemplates sind, ist dabei unerheblich. Also muss man sie künstlich in ein Template verwandeln, z.B.</p>
<pre><code class="language-cpp">template&lt;class T, const int n&gt;
struct foo
{
    foo(); // geht nicht als Template, da wir Templateparameter von Konstruktoren nur deduzieren können, und das entfällt bei 0 Parametern offensichtlich
    foo(T a);
    template&lt;typename U&gt;
    foo(U a, typename enable_if_c&lt; is_convertible&lt; U, T &gt;::value &amp;&amp; ( n &lt;= 2 ) &gt;::type b);
    template&lt;typename U&gt;
    foo(U a, typename enable_if_c&lt; is_convertible&lt; U, T &gt;::value &amp;&amp; ( n &gt; 2 ) &gt;::type b, T c = 3); // von hier an wird es einfach
</code></pre>
<p>Eine andere Lösung dieses speziellen Problems könnte natürlich auch darin liegen, ohne Defaultargumente die Konstruktoren für 0,1,2... Parameter zu erstellen und die Behandlung der verschiedenen n in die Implementation zu verschieben, mit den Mitteln von C++0x wird das leichter werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417553</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Sun, 09 Dec 2007 16:43:57 GMT]]></title><description><![CDATA[<p>Eine andere lösung ist mittels boost preprocessor sich dann eine &quot;prototyp&quot; überladung als makro zu schreiben, und dann 1-x spezialisierungen zu erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417672</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 09 Dec 2007 16:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Klasse je nach Typ teilweise übersetzen? on Mon, 10 Dec 2007 08:32:01 GMT]]></title><description><![CDATA[<p>spricht was gegen folgendes:</p>
<pre><code class="language-cpp">template &lt;class T, int n&gt; 
class FooImpl {
  /* gemeinsame Funktionen und Member für alle n */
  /* Member auf die die Ctoren zugreifen protected */
};

template &lt;class T&gt;
class FooImpl&lt;T,0&gt;; //nicht definiert um unsinnige n zu vermeiden

template &lt;class T, int n&gt;
class Foo : public FooImpl&lt;T, (n&gt;0?n:0)&gt; { //falls n &lt;= 0 wird von einer nicht definierten Klasse abgeleitet -&gt; Compiletime error
public: 
  Foo(T a=1, T b=2, T c=3);
};

template &lt;class T&gt;
class Foo&lt;T, 2&gt; : public FooImpl&lt;T,2&gt; {
public:
  Foo(T a=1, T b=2);
};

template &lt;class T&gt;
class Foo&lt;T, 1&gt; : public FooImpl&lt;T,1&gt; {
public:
  Foo(T a=1);
};
</code></pre>
<p>Man kann natürlich die Instatiierung für negative n auch verhindern indem man statt int size_t als templateparameter verwendet. Wollte nur aufzeigen, wie man unerwünschte n vermeiden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417931</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 10 Dec 2007 08:32:01 GMT</pubDate></item></channel></rss>