<?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[Instanzierung von Objekten vom Typ eines Template-Parameters]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab mal ne Frage bezüglich Instanzierung von Objekten vom Typ eines Template-Parameters in Template-Funktionen.</p>
<p>Hier mal ein kurzes Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{
};

template&lt;typename T&gt;
void doSomething(){
        T inst;
}

int main(int argc, char**)
{
        doSomething&lt;A&gt;();
}
</code></pre>
<p>Jetzt werden vor der Instanziierung noch Variablen angelegt, die je nach Typ interessant für den Konstruktor sind.<br />
Deswegen habe ich an folgendes Konstrukt gedacht:</p>
<pre><code class="language-cpp">class A{
};

class B{
public:
        B(int i){
        }
};

template&lt;typename T&gt;
T createObject(int i){
        return T();
}

template&lt;&gt;
B createObject&lt;B&gt;(int i){
        return B(i);
}

template&lt;typename T&gt;
void doSomething(){
        int i = 0;
        T inst(createObject&lt;T&gt;(i));
}

int main(int argc, char**)
{
        doSomething&lt;A&gt;();
        doSomething&lt;B&gt;();
}
</code></pre>
<p>Sobald ich jedoch den Copy-Konstruktor verbiete, funktioniert das verständlicherweise nicht mehr.</p>
<pre><code class="language-cpp">private:
        B(const B&amp; b){
        }
</code></pre>
<p>Deswegen habe ich an ein Konstrukt mit einer Hilfsklasse gedacht wie im folgenden Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{
public:
        void print(){
                std::cout &lt;&lt; &quot;A&quot; &lt;&lt; std::endl;
        }
};

class B{
public:
        B(int i){
        }

        void print(){
                std::cout &lt;&lt; &quot;B&quot; &lt;&lt; std::endl;
        }

private:
        B(const B&amp; b){
        }
};

template&lt;typename T&gt;
class FactoryHelper : public T{
public:
        FactoryHelper(int i) : T(){
        }
};

template&lt;&gt;
class FactoryHelper&lt;B&gt; : public B{
public:
        FactoryHelper(int i) : B(i){
        }
};

template&lt;typename T&gt;
void doSomething(){
        int i = 0;
        FactoryHelper&lt;T&gt; inst(i);
        inst.print();
}

int main(int argc, char**)
{
        doSomething&lt;A&gt;();
        doSomething&lt;B&gt;();
}
</code></pre>
<p>Wie würdet ihr sowas lösen?<br />
Also ich würde das Objekt gerne auf dem Stack haben. Ansonsten bieten sich natürlich Möglichkeiten das Objekt ohne Kopieren<br />
zurückzugeben.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274429/instanzierung-von-objekten-vom-typ-eines-template-parameters</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 14:10:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274429.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Sep 2010 01:54:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Instanzierung von Objekten vom Typ eines Template-Parameters on Sun, 26 Sep 2010 01:54:13 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab mal ne Frage bezüglich Instanzierung von Objekten vom Typ eines Template-Parameters in Template-Funktionen.</p>
<p>Hier mal ein kurzes Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{
};

template&lt;typename T&gt;
void doSomething(){
        T inst;
}

int main(int argc, char**)
{
        doSomething&lt;A&gt;();
}
</code></pre>
<p>Jetzt werden vor der Instanziierung noch Variablen angelegt, die je nach Typ interessant für den Konstruktor sind.<br />
Deswegen habe ich an folgendes Konstrukt gedacht:</p>
<pre><code class="language-cpp">class A{
};

class B{
public:
        B(int i){
        }
};

template&lt;typename T&gt;
T createObject(int i){
        return T();
}

template&lt;&gt;
B createObject&lt;B&gt;(int i){
        return B(i);
}

template&lt;typename T&gt;
void doSomething(){
        int i = 0;
        T inst(createObject&lt;T&gt;(i));
}

int main(int argc, char**)
{
        doSomething&lt;A&gt;();
        doSomething&lt;B&gt;();
}
</code></pre>
<p>Sobald ich jedoch den Copy-Konstruktor verbiete, funktioniert das verständlicherweise nicht mehr.</p>
<pre><code class="language-cpp">private:
        B(const B&amp; b){
        }
</code></pre>
<p>Deswegen habe ich an ein Konstrukt mit einer Hilfsklasse gedacht wie im folgenden Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{
public:
        void print(){
                std::cout &lt;&lt; &quot;A&quot; &lt;&lt; std::endl;
        }
};

class B{
public:
        B(int i){
        }

        void print(){
                std::cout &lt;&lt; &quot;B&quot; &lt;&lt; std::endl;
        }

private:
        B(const B&amp; b){
        }
};

template&lt;typename T&gt;
class FactoryHelper : public T{
public:
        FactoryHelper(int i) : T(){
        }
};

template&lt;&gt;
class FactoryHelper&lt;B&gt; : public B{
public:
        FactoryHelper(int i) : B(i){
        }
};

template&lt;typename T&gt;
void doSomething(){
        int i = 0;
        FactoryHelper&lt;T&gt; inst(i);
        inst.print();
}

int main(int argc, char**)
{
        doSomething&lt;A&gt;();
        doSomething&lt;B&gt;();
}
</code></pre>
<p>Wie würdet ihr sowas lösen?<br />
Also ich würde das Objekt gerne auf dem Stack haben. Ansonsten bieten sich natürlich Möglichkeiten das Objekt ohne Kopieren<br />
zurückzugeben.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957539</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 26 Sep 2010 01:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzierung von Objekten vom Typ eines Template-Parameters on Sun, 26 Sep 2010 05:40:53 GMT]]></title><description><![CDATA[<p>Für diesen Anwendungsfall sieht das so eigentlich schön geradlinig aus. Allerdings kann die Notwendigkeit solcher Kunstgriffe auf andere Designmängel hindeuten - was genau hast du eigentlich vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957549</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 26 Sep 2010 05:40:53 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzierung von Objekten vom Typ eines Template-Parameters on Sun, 26 Sep 2010 09:14:41 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Wie würdet ihr sowas lösen?</p>
</blockquote>
<pre><code class="language-cpp">template&lt;typename T&gt;
void doSomething(const T&amp; inst)
{
  // do something with inst
}

int main()
{
  A a;
  doSomething(a);
  B b(1);
  doSomething(b);
  return 0;
}
</code></pre>
<p>Wenn A und B unterschiedliche Konstruktoren haben, sind die Ctors einfach nicht geeignet um sie in einem Template aufzurufen. Die Typen sind an dieser Stelle einfach anders.<br />
Deine FactoryHelper Sache ist auch überhaupt nicht erweiterbar. Wenn jetzt C ankommt mit einem Ctor mit Signatur (int, int) musst du alles ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957575</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 26 Sep 2010 09:14:41 GMT</pubDate></item></channel></rss>