<?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[Problem mit Template (Zeiger und Wertetypen)]]></title><description><![CDATA[<p>Hallo zusammen<br />
Ich zerbreche mir im Moment den Kopf bezüglich Templates und zwar habe ich folgende Situation. Man kann ja ein Template generell mit einem Zeigertyp oder einem Wertetyp generieren:</p>
<p>MyMethod&lt;int&gt;(a,b);<br />
MyMethod&lt;int*&gt;(a,b);</p>
<p>Das Problem ist nun, dass ich innerhalb des Template bestimmte Dinge mit den Daten macht, welche eine Unterscheidung zwischen Wertetyp sowie Zeigertyp erforderlich macht. Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 if(t1 &lt; t2) usw...
}
</code></pre>
<p>Nun ist sofort ersichtlich, dass dies mit einem Zeigertyp nicht funktionieren wird.</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 if(*t1 &lt; *t2) usw...
}
</code></pre>
<p>Dies funktioniert nun nicht mehr mit einem Wertetyp. Oder naja, vielleicht funktioniert es, weil gewisse Compiler soviel ich weis die Dereferenzierung eines Wertetyps ignorieren. Aber dann hat man das Problem immer noch sobald ich so etwas mache:</p>
<p>MyMethod&lt;int**&gt;(a,b);</p>
<p>Oder was ist, wenn ich beispielsweise irgendwo ein delete habe?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 delete t1;
}
</code></pre>
<p>Könnte man vielleicht noch so umgehen für Wertetypen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 delete reinterpret_cast&lt;T*&gt;(t1);
}
</code></pre>
<p>Ist halt extrem gefährlich und darf dann mit Wertetypen niemals aufgerufen werden, aber immerhin ist es kompilierbar. (Macht hier natürlich keinen Sinn, aber vielleicht ist diese Methode innerhalb einer Klasse).</p>
<p>Meine Beispiele sind sicherlich nicht besonders geschickt gewählt, doch für die Problematik aufzuzeigen vielleicht doch gar nicht so schlecht?</p>
<p>Mfg Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253256/problem-mit-template-zeiger-und-wertetypen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 23:26:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253256.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Oct 2009 15:25:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 15:27:43 GMT]]></title><description><![CDATA[<p>Hallo zusammen<br />
Ich zerbreche mir im Moment den Kopf bezüglich Templates und zwar habe ich folgende Situation. Man kann ja ein Template generell mit einem Zeigertyp oder einem Wertetyp generieren:</p>
<p>MyMethod&lt;int&gt;(a,b);<br />
MyMethod&lt;int*&gt;(a,b);</p>
<p>Das Problem ist nun, dass ich innerhalb des Template bestimmte Dinge mit den Daten macht, welche eine Unterscheidung zwischen Wertetyp sowie Zeigertyp erforderlich macht. Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 if(t1 &lt; t2) usw...
}
</code></pre>
<p>Nun ist sofort ersichtlich, dass dies mit einem Zeigertyp nicht funktionieren wird.</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 if(*t1 &lt; *t2) usw...
}
</code></pre>
<p>Dies funktioniert nun nicht mehr mit einem Wertetyp. Oder naja, vielleicht funktioniert es, weil gewisse Compiler soviel ich weis die Dereferenzierung eines Wertetyps ignorieren. Aber dann hat man das Problem immer noch sobald ich so etwas mache:</p>
<p>MyMethod&lt;int**&gt;(a,b);</p>
<p>Oder was ist, wenn ich beispielsweise irgendwo ein delete habe?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 delete t1;
}
</code></pre>
<p>Könnte man vielleicht noch so umgehen für Wertetypen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 delete reinterpret_cast&lt;T*&gt;(t1);
}
</code></pre>
<p>Ist halt extrem gefährlich und darf dann mit Wertetypen niemals aufgerufen werden, aber immerhin ist es kompilierbar. (Macht hier natürlich keinen Sinn, aber vielleicht ist diese Methode innerhalb einer Klasse).</p>
<p>Meine Beispiele sind sicherlich nicht besonders geschickt gewählt, doch für die Problematik aufzuzeigen vielleicht doch gar nicht so schlecht?</p>
<p>Mfg Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800785</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Fri, 30 Oct 2009 15:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 15:37:47 GMT]]></title><description><![CDATA[<p>Du könntest eine Spezialisierung des Templates für Zeigertypen machen.<br />
Etwa so:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T *t1,T *t2){
 if(*t1 &lt; *t2) usw...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1800793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800793</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 30 Oct 2009 15:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 15:38:58 GMT]]></title><description><![CDATA[<p>OK, und der Compiler nimmt dann automatisch die korrekte Version?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800794</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Fri, 30 Oct 2009 15:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 15:44:06 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>OK, und der Compiler nimmt dann automatisch die korrekte Version?</p>
</blockquote>
<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800796</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 30 Oct 2009 15:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 15:46:11 GMT]]></title><description><![CDATA[<p>Ich kann mir das Ganze irgendwie noch nicht so ganz vorstellen. Könntest du mir ein kleines Beispiel geben:</p>
<p>Mit einer Klasse mit sagen wir 3 Methoden, von welchen 1 spezialisert für Zeigertypen sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800799</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Fri, 30 Oct 2009 15:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 16:07:38 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Das Problem ist nun, dass ich innerhalb des Template bestimmte Dinge mit den Daten macht, welche eine Unterscheidung zwischen Wertetyp sowie Zeigertyp erforderlich macht.</p>
</blockquote>
<p>Warum? Klingt nach einem schlechten Design.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Oder naja, vielleicht funktioniert es, weil gewisse Compiler soviel ich weis die Dereferenzierung eines Wertetyps ignorieren.</p>
</blockquote>
<p>Kann man nicht erwarten, nein. Ein solches Programm ist einfach nicht gültig.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Aber dann hat man das Problem immer noch sobald ich so etwas mache:</p>
<p>MyMethod&lt;int**&gt;(a,b);</p>
</blockquote>
<p>Ja und? Was soll denn dann passieren?</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Oder was ist, wenn ich beispielsweise irgendwo ein delete habe?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
delete t1;
}
</code></pre>
<p>Könnte man vielleicht noch so umgehen für Wertetypen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T t1,T t2){
 delete reinterpret_cast&lt;T*&gt;(t1);
}
</code></pre>
</blockquote>
<p>Ganz großer Käse das. Kling nach einem schlechten Design.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Meine Beispiele sind sicherlich nicht besonders geschickt gewählt, doch für die Problematik aufzuzeigen vielleicht doch gar nicht so schlecht?</p>
</blockquote>
<p>Hmmm... Der Ansatz ist komisch. In der Regel hat man bei Templates mit Typ-Parametern zu tun, die einem bestimmten (zu dokumentierenden) Konzept entsprechen. Zb das Konzept &quot;Zeigerartig&quot; oder &quot;Werttyp&quot;. Natürlich kann man einen Zeiger wie einen &quot;Werttyp&quot; behandeln, Du kannst ja auch einen Vektor aus Zeigern anlegen. Den Vektor interessiert dann aber nicht, ob man auf den Elementen auch delete aufrufen kann. Wenn Du konzeptionell unterschiedliche Dinge machen willst, warum dann nicht einfach mehrere Funktionen bzw Funktionstemplates mit unterschiedlichen Namen dafür definieren?</p>
<p>Erzähl doch mal, wo das Problem wirklich liegt. Warum denkst Du, so eine Sonderbehandlung zu benötigen? Was ist das für ein komisches Design?</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800806</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 30 Oct 2009 16:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 16:10:10 GMT]]></title><description><![CDATA[<p>XMaster schrieb:</p>
<blockquote>
<p>Du könntest eine Spezialisierung des Templates für Zeigertypen machen.<br />
Etwa so:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; MyMethod(T *t1,T *t2){
 if(*t1 &lt; *t2) usw...
}
</code></pre>
</blockquote>
<p>Das ist keine Spezialisierung. Das ist ein neues Funktionstemplate (Überladung). Ist aber auch eigentlich besser so (meist). Partielle Spezialisierungen von Funktionstemplates gibt's auch gar nicht.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800809</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 30 Oct 2009 16:10:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 16:12:49 GMT]]></title><description><![CDATA[<p>Ok, ein kurzen Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

// Template-Methode
template&lt;class T&gt; void F(T x)
{
    cout &lt;&lt; x &lt;&lt; endl;
}

// Spezialisierung
template&lt;class T&gt; void F(T *x)
{
	cout &lt;&lt; *x &lt;&lt; endl;
}

int main()
{
	int i = 3;
	int *pi = &amp;i;

	F(i);   // Ausgabe: 3
	F(pi);  // Ausgabe: auch 3 (!) - hier wird die Spezialisierung aufgerufen

	return 0;
}
</code></pre>
<p>Das funktioniert aber nur, wenn die Variablen direkt Pointer auf Werte sind. Wenn du jetzt noch einen Pointer int **ppi = π hättest und dieses F übergibst, würde zwar auch die Spezialisierung aufgerufen werden, diese würde aber *ppi ausgeben, also pi und nicht i, was **ppi wäre.</p>
<p>EDIT:</p>
<blockquote>
<p>Das ist keine Spezialisierung. Das ist ein neues Funktionstemplate (Überladung). Ist aber auch eigentlich besser so (meist). Partielle Spezialisierungen von Funktionstemplates gibt's auch gar nicht.</p>
</blockquote>
<p>Hm, da hab ich mich wohl mit der Terminologie verhauen :D. Aber gut, wie das am Ende heißt, ist für den Sachverhalt ja auch relativ egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800810</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 30 Oct 2009 16:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template (Zeiger und Wertetypen) on Fri, 30 Oct 2009 16:19:46 GMT]]></title><description><![CDATA[<p>XMaster schrieb:</p>
<blockquote>
<p>Ok, ein kurzen Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

// Template-Methode
template&lt;class T&gt; void F(T x)
{
    cout &lt;&lt; x &lt;&lt; endl;
}

// Spezialisierung
template&lt;class T&gt; void F(T *x)
{
	cout &lt;&lt; *x &lt;&lt; endl;
}

int main()
{
	int i = 3;
	int *pi = &amp;i;

	F(i);   // Ausgabe: 3
	F(pi);  // Ausgabe: auch 3 (!) - hier wird die Spezialisierung aufgerufen

	return 0;
}
</code></pre>
</blockquote>
<p>Das hier ist ein Beispiel für den Missbrauch der Überladung. Diese zwei Funktions-Templates machen konzeptionell etwas anders. Das eine gibt das Objekt direkt aus, das andere dereferenziert vorher. Warum haben diese Funktions-Templates den gleichen Namen wenn sie von der Idee her etwas anderes machen?</p>
<blockquote>
<p>Hm, da hab ich mich wohl mit der Terminologie verhauen :D. Aber gut, wie das am Ende heißt, ist für den Sachverhalt ja auch relativ egal.</p>
</blockquote>
<p>Egal? Nein. &quot;Spezialisierung&quot; gibt es auch, auch für Funktions-Templates. Das macht man aber anders und ist meist auch eine schlechte Idee (bei Funktionen).</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1800813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1800813</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 30 Oct 2009 16:19:46 GMT</pubDate></item></channel></rss>