<?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, Objekt&#x2F;Pointer unterscheiden..]]></title><description><![CDATA[<p>Die folgende Klasse wird unterschiedlich, mit ItemHandle&lt;x&gt; oder mit<br />
ItemHandle&lt;x*&gt; instanziert, was auch so bleiben soll. Allerdings habe<br />
ich dadurch das Problem, daß der Konstruktor einmal element.bbox()<br />
und einmal element-&gt;bbox() aufrufen müßte. Gibt es eine Möglichkeit<br />
zu unterscheiden, ob da ein Pointer oder eine Klasse hereinkommt?</p>
<pre><code class="language-cpp">template&lt;class T_Item&gt;
class ItemHandle  
{
public:
	ItemHandle(const T_Item&amp; element_);
private:
	Bbox itemBB;	
};

template&lt;class T_Item&gt;
ItemHandle&lt;T_Item&gt;::ItemHandle(const T_Item&amp; element_) : itemBB(element.bbox())
{
}
}
</code></pre>
<p>..danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296759/template-objekt-pointer-unterscheiden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 16:15:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296759.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Dec 2011 19:18:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 19:18:47 GMT]]></title><description><![CDATA[<p>Die folgende Klasse wird unterschiedlich, mit ItemHandle&lt;x&gt; oder mit<br />
ItemHandle&lt;x*&gt; instanziert, was auch so bleiben soll. Allerdings habe<br />
ich dadurch das Problem, daß der Konstruktor einmal element.bbox()<br />
und einmal element-&gt;bbox() aufrufen müßte. Gibt es eine Möglichkeit<br />
zu unterscheiden, ob da ein Pointer oder eine Klasse hereinkommt?</p>
<pre><code class="language-cpp">template&lt;class T_Item&gt;
class ItemHandle  
{
public:
	ItemHandle(const T_Item&amp; element_);
private:
	Bbox itemBB;	
};

template&lt;class T_Item&gt;
ItemHandle&lt;T_Item&gt;::ItemHandle(const T_Item&amp; element_) : itemBB(element.bbox())
{
}
}
</code></pre>
<p>..danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155855</guid><dc:creator><![CDATA[tpl]]></dc:creator><pubDate>Sun, 11 Dec 2011 19:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 19:23:58 GMT]]></title><description><![CDATA[<p>Der übliche Weg eine solche Unterscheidung zu machen wäre über Spezialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155858</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 11 Dec 2011 19:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 19:30:32 GMT]]></title><description><![CDATA[<p>tpl schrieb:</p>
<blockquote>
<p>Die folgende Klasse wird unterschiedlich, mit ItemHandle&lt;x&gt; oder mit<br />
ItemHandle&lt;x*&gt; instanziert, was auch so bleiben soll. Allerdings habe<br />
ich dadurch das Problem, daß der Konstruktor einmal element.bbox()<br />
und einmal element-&gt;bbox() aufrufen müßte. Gibt es eine Möglichkeit<br />
zu unterscheiden, ob da ein Pointer oder eine Klasse hereinkommt?</p>
<pre><code class="language-cpp">template&lt;class T_Item&gt;
class ItemHandle  
{
public:
	ItemHandle(const T_Item&amp; element_);
private:
	Bbox itemBB;	
};

template&lt;class T_Item&gt;
ItemHandle&lt;T_Item&gt;::ItemHandle(const T_Item&amp; element_) : itemBB(element.bbox())
{
}
}
</code></pre>
<p>..danke!</p>
</blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct is_pointer_type
{
    enum { value = false };
};

template &lt;typename T&gt;
struct is_pointer_type&lt;T*&gt;
{
    enum { value = true };
};

template &lt;typename T&gt;
bool is_pointer(const T&amp;)
{
    return is_pointer_type&lt;T&gt;::value;
}
</code></pre>
<p>Dann anwenden :xmas1:</p>
<p><a href="http://ideone.com/ESMtM#view_edit_box" rel="nofollow">http://ideone.com/ESMtM#view_edit_box</a></p>
<p>Geprüft (atschibätsch PI).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155860</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 11 Dec 2011 19:30:32 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 19:41:02 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct is_pointer_type
{
    enum { value = false };
};

template &lt;typename T&gt;
struct is_pointer_type&lt;T*&gt;
{
    enum { value = true };
};

template &lt;typename T&gt;
bool is_pointer(const T&amp;)
{
    return is_pointer_type&lt;T&gt;::value;
}
</code></pre>
<p>Dann anwenden :xmas1:</p>
<p><a href="http://ideone.com/ESMtM#view_edit_box" rel="nofollow">http://ideone.com/ESMtM#view_edit_box</a></p>
<p>Geprüft (atschibätsch PI).</p>
</blockquote>
<p>Geil! Das sollte die Lösung sein, ich werds gleich probieren. Ich kann mich<br />
jetzt auch erinnern, daß ich davon mal gelesen habe, und zwar in Alexandrescu's<br />
Modern C++ Design.</p>
<p>Danke fürn Hinweis!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155866</guid><dc:creator><![CDATA[tpl]]></dc:creator><pubDate>Sun, 11 Dec 2011 19:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 22:35:31 GMT]]></title><description><![CDATA[<p>Hm, das war jetzt doch nicht die Lösung, denn is_pointer() generiert einen<br />
Wert, aber was ich brauche, ist eine Unterscheidung zur Compile-Zeit, denn</p>
<pre><code>if(is_pointer(a)) a-&gt;bbox();
  else a.bbox();
</code></pre>
<p>compiliert natürlich nicht. Wie könnte man denn die vorgeschlagene<br />
Spezialisierung syntaktisch umsetzen? Ich habe Beispiel gefunden, wo<br />
man für einen festen Typ spezialisiert, aber wie denn, wenn der Typ<br />
ein Template-Parameter ist wie in diesem Fall?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155949</guid><dc:creator><![CDATA[tpl]]></dc:creator><pubDate>Sun, 11 Dec 2011 22:35:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 22:53:47 GMT]]></title><description><![CDATA[<p>Bei einzelnen Funktionen mit Überladung:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void do_stuff(T* obj)
{
    // Zeigervariante
}

template &lt;typename T&gt;
void do_stuff(T&amp; obj)
{
    // Referenzvariante
}
</code></pre>
<p>Bei Klassen mithilfe einer Spzialisierung:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct foo { ... };

template &lt;typename T&gt;
struct foo&lt;T*&gt; { ... };
</code></pre>
<p>Ich kann mir nicht vorstellen, dass Hackers Ding da irgendwie ne Hilfe ist. Zumal es das Ding sowieso schon unter std::is_pointer in &lt;type_traits&gt; gibt.</p>
<p>Edit: Und in deinem Fall würde ich einfach einen zweiten Ctor basteln, der einen const T* nimmt.</p>
<p>Edit 2: Achso, ich seh schon das Problem. Ist schon etwas spät <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="🤡"
    /><br />
Ich würde wohl zwei Ctoren schreiben, die so aussehen:</p>
<pre><code class="language-cpp">ItemHandle(typename std::remove_pointer&lt;T&gt;::type* ptr);
ItemHandle(typename std::remove_pointer&lt;T&gt;::type&amp; ref);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2155953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155953</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 11 Dec 2011 22:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 22:53:10 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt; struct pointersensitiv
{
  pointersensitiv(T a) {a.foo();}
};

template&lt;typename T&gt; struct pointersensitiv&lt;T*&gt;
{
  pointersensitiv(T* a) {a-&gt;foo();}
};

#include&lt;iostream&gt;
struct nur_zum_test
{
  void foo() {std::cout &lt;&lt; &quot;Foo!\n&quot;;}
};

int main()
{
  nur_zum_test bar;
  pointersensitiv&lt;nur_zum_test&gt; objekt(bar);
  pointersensitiv&lt;nur_zum_test*&gt; pointer(&amp;bar);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2155961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155961</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 11 Dec 2011 22:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 23:20:10 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt;
T&amp;&amp; deref(T&amp;&amp; v) { return std::forward&lt;T&gt;(v); }

template &lt;typename T&gt;
T&amp; deref(T* v) { return *v; }
</code></pre>
<p>und dann einfach überall, wo a.foo() oder a-&gt;foo() auftauchen würde:</p>
<pre><code class="language-cpp">deref(a).foo()
</code></pre>
<p>schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155970</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 11 Dec 2011 23:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sun, 11 Dec 2011 23:41:19 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Buääääääh, Konstruktoren als Funktionen misbrauchen ist mir ein Gräul <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="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155979</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 11 Dec 2011 23:41:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Mon, 12 Dec 2011 01:13:28 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt;
T&amp;&amp; deref(T&amp;&amp; v) { return std::forward&lt;T&gt;(v); }

template &lt;typename T&gt;
T&amp; deref(T* v) { return *v; }
</code></pre>
<p>und dann einfach überall, wo a.foo() oder a-&gt;foo() auftauchen würde:</p>
<pre><code class="language-cpp">deref(a).foo()
</code></pre>
<p>schreiben.</p>
</blockquote>
<p>Danke, das war die Lösung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Die erste Funktion mußte ich aber anpassen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T&amp; deref(T&amp; v) { return v; }

template &lt;typename T&gt;
T&amp; deref(T* v) { return *v; }
</code></pre>
<p>was sollte denn das T&amp;&amp; deref(T&amp;&amp; v) bedeuten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156000</guid><dc:creator><![CDATA[tpl]]></dc:creator><pubDate>Mon, 12 Dec 2011 01:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Mon, 12 Dec 2011 07:07:03 GMT]]></title><description><![CDATA[<p>campers Lösung hat sowohl LValues als auch RValues geschluckt. Deine nimmt nur LValues. Stichwörter: Perfect Forwarding, Reference Collapsing.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156017</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 12 Dec 2011 07:07:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Mon, 12 Dec 2011 07:20:41 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Stichwörter: Perfect Forwarding, Reference Collapsing.</p>
</blockquote>
<p>Und vor allem Anderen Stichwort C++11 und Rvalue-Referenzen. Wenn du das anpassen musstest, kann dein Compiler das wohl noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156021</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 12 Dec 2011 07:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Mon, 12 Dec 2011 09:44:19 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Stichwörter: Perfect Forwarding, Reference Collapsing.</p>
</blockquote>
<p>Und vor allem Anderen Stichwort C++11 und Rvalue-Referenzen. Wenn du das anpassen musstest, kann dein Compiler das wohl noch nicht.</p>
</blockquote>
<p>Ah, gcc version 4.5.2, und die Software soll am Ende auch noch auf VS 2008<br />
compilieren. Daher habe ich es mit C++11 gar nicht eilig <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>
<p>Danke allen für die Hinweise, das Problem ist nun gut gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156063</guid><dc:creator><![CDATA[tpl]]></dc:creator><pubDate>Mon, 12 Dec 2011 09:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Mon, 12 Dec 2011 09:46:02 GMT]]></title><description><![CDATA[<p>Beim GCC brauchst du nur beim kompilieren -std=c++0x angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156064</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 12 Dec 2011 09:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Mon, 12 Dec 2011 09:47:18 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Buääääääh, Konstruktoren als Funktionen misbrauchen ist mir ein Gräul <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="🤡"
    /></p>
</blockquote>
<p>Mir auch. Der Threadersteller hat aber ausdrücklich danach gefragt. Wenn du schnell gewesen wärst, hättest du vor dem edit noch eine Version mit normalen Funktoren gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156065</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Dec 2011 09:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sat, 17 Dec 2011 15:01:35 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Beim GCC brauchst du nur beim kompilieren -std=c++0x angeben.</p>
</blockquote>
<p>Oder, wie bei mir (wie schon bei unserer Spielwiese festgestellt):<br />
-std=gnu++0x</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158058</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 17 Dec 2011 15:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sat, 17 Dec 2011 15:20:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Zuletzt bearbeitet von Hacker am 16:01:35 17.12.2011, insgesamt 1-mal bearbeitet</p>
</blockquote>
<p>Um uns das mitzuteilen musstest du den Thread nochmals ausgegraben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158064</guid><dc:creator><![CDATA[h4xx02]]></dc:creator><pubDate>Sat, 17 Dec 2011 15:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template, Objekt&#x2F;Pointer unterscheiden.. on Sat, 17 Dec 2011 15:33:37 GMT]]></title><description><![CDATA[<p>h4xx02 schrieb:</p>
<blockquote>
<blockquote>
<p>Zuletzt bearbeitet von Hacker am 16:01:35 17.12.2011, insgesamt 1-mal bearbeitet</p>
</blockquote>
<p>Um uns das mitzuteilen musstest du den Thread nochmals ausgegraben?</p>
</blockquote>
<p>1. Falsches Deutsch,<br />
2. Ja. Denn bei mir z.B. klappt das anders nicht, und wenn dich der Thread nervt dann ignorier ihn verdammt nochmal. Dadurch das du (und eig. ich auch) ihn weiter befüllen <em>bleibt</em> er ausgegraben. :xmas1: <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158068</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 17 Dec 2011 15:33:37 GMT</pubDate></item></channel></rss>