<?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[compile-time zeigertyp ermittlung]]></title><description><![CDATA[<p>hi,</p>
<p>wie kann ich zur compile-zeit ermitteln von welchem typ ein zeiger ist? also wenn ich <strong>int</strong>* habe, soll <strong>int</strong> geliefert werden.</p>
<p>habs mit folgenden templates versucht, allerdings scheints damit nicht recht zu klappen...</p>
<pre><code class="language-cpp">// wenn der typ T ein zeiger ist, dann T zurueckgeben
template &lt;typename T&gt; struct GetRealType           { typedef T Type; };
template &lt;typename T&gt; struct GetRealType&lt;T*&gt;       { typedef T Type; };
template &lt;typename T&gt; struct GetRealType&lt;const T*&gt; { typedef T Type; };

// im code dann
template &lt;typename IteratorType&gt;
inline void Funktion(IteratorType First, IteratorType Last)
{
  // hier ist RealType scheinbar immer noch IteratorType
  typedef typename GetRealType&lt;IteratorType&gt;::Type RealType;

  // und dann zum beispiel folgender aufruf
  AndereFunktion(sizeof(RealType));
}

int *a = new int[10];
Funktion(a, a + 10);
</code></pre>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125087/compile-time-zeigertyp-ermittlung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 04:29:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125087.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Nov 2005 11:50:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 11:50:46 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>wie kann ich zur compile-zeit ermitteln von welchem typ ein zeiger ist? also wenn ich <strong>int</strong>* habe, soll <strong>int</strong> geliefert werden.</p>
<p>habs mit folgenden templates versucht, allerdings scheints damit nicht recht zu klappen...</p>
<pre><code class="language-cpp">// wenn der typ T ein zeiger ist, dann T zurueckgeben
template &lt;typename T&gt; struct GetRealType           { typedef T Type; };
template &lt;typename T&gt; struct GetRealType&lt;T*&gt;       { typedef T Type; };
template &lt;typename T&gt; struct GetRealType&lt;const T*&gt; { typedef T Type; };

// im code dann
template &lt;typename IteratorType&gt;
inline void Funktion(IteratorType First, IteratorType Last)
{
  // hier ist RealType scheinbar immer noch IteratorType
  typedef typename GetRealType&lt;IteratorType&gt;::Type RealType;

  // und dann zum beispiel folgender aufruf
  AndereFunktion(sizeof(RealType));
}

int *a = new int[10];
Funktion(a, a + 10);
</code></pre>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907205</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Thu, 03 Nov 2005 11:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 11:58:46 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt; struct GetRealType&lt;const T*&gt; { typedef T Type; };
</code></pre>
<p>sollte besser so aussehen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct GetRealType&lt;T* const&gt; { typedef T Type; };
</code></pre>
<p>und am besten benutzt du schon das, was die stl dir liefert für iteratoren:</p>
<pre><code class="language-cpp">iterator_traits&lt;IteratorType&gt;::value_type
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/907215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907215</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 03 Nov 2005 11:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 12:08:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef T Type;
</code></pre>
<p>funktioniert nicht in einem Template in der gewünschen Weise. Musst</p>
<pre><code class="language-cpp">typedef typename T Type;
</code></pre>
<p>verwenden, dann klaps auch mit dem Compilieren <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/907224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907224</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Thu, 03 Nov 2005 12:08:08 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 12:08:17 GMT]]></title><description><![CDATA[<p>Mathias schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt; struct GetRealType           { typedef T Type; };
template &lt;typename T&gt; struct GetRealType&lt;T*&gt;       { typedef T Type; };
template &lt;typename T&gt; struct GetRealType&lt;const T*&gt; { typedef T Type; };
</code></pre>
<p>Was soll denn das darstellen? *sich am Hinterkopf kratzt*</p>
<p>Wie wärs mit sowas?</p>
<pre><code class="language-cpp">template &lt;class T&gt; T FunktionX (T * pParameter);
</code></pre>
<p>:p</p>
</blockquote>
<p>nein, das ist nicht gut. damit kannst du zwar innerhalb der funktion damit arbeiten, aber du kannst nicht die information darüber zurückgeben, was das nun für ein typ ist^^.</p>
<p>versuch mal sowas mit deiner funktion:</p>
<pre><code class="language-cpp">std::vector&lt;typename iterator_traits&lt;IteratorType&gt;::value_type&gt; bar;
</code></pre>
<blockquote>
<p>Ansonsten kannst du einen Typ in einem Template nicht mit</p>
<pre><code class="language-cpp">typedef T Type;
</code></pre>
<p>definieren, sondern mit</p>
<pre><code class="language-cpp">typedef typename T Type;
</code></pre>
<p>dann klaps auch mit dem Compilieren <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>
</blockquote>
<p>nope, in dem fall brauchst du kein typename, weil T in dem fall keine zahl sein kann, sondern ein typ sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907230</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 03 Nov 2005 12:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 13:26:44 GMT]]></title><description><![CDATA[<p>wenn ich</p>
<pre><code class="language-cpp">typedef std::iterator_traits&lt;IteratorType&gt;::value_type RealType;
</code></pre>
<p>verwende, bekomme ich den gleichen fehler (zuweisung klappt nicht, da RealType immer noch ein zeiger ist.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907335</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Thu, 03 Nov 2005 13:26:44 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 13:39:21 GMT]]></title><description><![CDATA[<p>könnte natürlich sein, dass der borland compiler, den ich verwende, dies nicht unterstützt...</p>
<p>wenn ich folgendes beispiel im debug-modus durchlaufe, ruft der im <strong>copy</strong> zum kopieren nicht memcpy auf, sondern macht die zuweisung mit ner kopierschleife obwohl es sich ja um eine einfachen zuweisungsdatentyp handelt.</p>
<pre><code class="language-cpp">int d11[4] = {1,2,3,4};
int d12[4] = {5,6,7,8};

// Set up two vectors
std::vector&lt;int&gt; v1(d11, d11 + 4);
std::vecotr&lt;int&gt; v2(d12, d12 + 4);

// Copy v1 to v2
std::copy(v1.begin(),v1.end(),v2.begin());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/907349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907349</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Thu, 03 Nov 2005 13:39:21 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 14:09:05 GMT]]></title><description><![CDATA[<p>Sunday schrieb:</p>
<blockquote>
<p>wenn ich</p>
<pre><code class="language-cpp">typedef std::iterator_traits&lt;IteratorType&gt;::value_type RealType;
</code></pre>
<p>verwende, bekomme ich den gleichen fehler (zuweisung klappt nicht, da RealType immer noch ein zeiger ist.).</p>
</blockquote>
<p>kann nicht sein!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907393</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 03 Nov 2005 14:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 14:18:15 GMT]]></title><description><![CDATA[<p>irgendwie bin ich grad ratlos. nachdem ich mein projekt jetzt zum 10. mal neu kompiliert habe, funktioniert der code aus dem 1. beitrag komischerweise. zum haare raufen.</p>
<p>und ...</p>
<pre><code class="language-cpp">typedef std::iterator_traits&lt;IteratorType&gt;::value_type RealType;
</code></pre>
<p>funktioniert jetzt auch...</p>
<p>zum glück ist bald feierabend... *seufz* <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/907400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907400</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Thu, 03 Nov 2005 14:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to compile-time zeigertyp ermittlung on Thu, 03 Nov 2005 15:02:29 GMT]]></title><description><![CDATA[<p>ist vielleicht besser (siehe die konfusion oben), die eliminierung von cv-qualifizierern separat durchzuführen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;struct NoVolatile { typedef T type; };
template&lt;typename T&gt;struct NoVolatile&lt;T volatile&gt; { typedef T type; };

template&lt;typename T&gt;struct NoConst { typedef T type; };
template&lt;typename T&gt;struct NoConst&lt;T const&gt; { typedef T type; };

template&lt;typename T&gt;struct NoRef { typedef T type; };
template&lt;typename T&gt;struct NoRef&lt;T*&gt; { typedef T type; };

template&lt;typename T&gt;struct RealType { typedef typename NoRef&lt;typename NoConst&lt;typename NoVolatile&lt;T&gt;::type&gt;::type&gt;::type type; };
</code></pre>
<p>es wird eben sonst leicht sehr unübersichtlich, und es schleichen sich fehler ein, wo genau das const denn nun hin muss.</p>
<p>const/volatile kann man nat. auch zusammen abhandeln, das spart sogar etwas tipparbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907449</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Nov 2005 15:02:29 GMT</pubDate></item></channel></rss>