<?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[typeid und templates]]></title><description><![CDATA[<p>Hi</p>
<p>Ich weis nicht wie ich das machen soll:</p>
<p>Ich moechte in einer function einer template classe code abhaenig vom type ausfuehren indem ich mit typeid teste ob der von der gewuenschten classe ist:</p>
<pre><code class="language-cpp">template &lt;class Type&gt; class  ClassName
 {
...
 public: void DoSomething(Type * Data)
  {
  if(typeid(Data) == typeid(ClassWantedToBe*)) ...;

  }
 }
</code></pre>
<p>Das funktioniert auch so, ABER jetzt ist die ClassWantedToBe auch ein template, so funtioniert es mit</p>
<pre><code class="language-cpp">...
if(typeid(Data) == typeid(ClassWantedToBe&lt;SpecialType&gt;*)) ...;
...
</code></pre>
<p>Jetzt mein Problem: ich moechte den selben test machen, aber ohne zu wissen wie das tempalte ClassWantedToBe benutzt wurde. Ich will testen ob Data von type ClassWantedToBe ist unabhaening vom SpecialType, meint:</p>
<pre><code class="language-cpp">if(typeid(Data) == typeid(ClassWantedToBe&lt;??&gt;*))...
</code></pre>
<p>ich moechte true wenn Data von dem template ClassWantedToBe kommt egal mit welchem type das template benuzt wurde. (also ist mir egal was ?? ist, hauptsache irgendein type von ClassWantedToBe&lt;..&gt; ) Wie geht das?</p>
<p>Vielen Dank fuer Hinweise</p>
<p>Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129479/typeid-und-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 06:06:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129479.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Dec 2005 04:00:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to typeid und templates on Wed, 14 Dec 2005 05:50:22 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich weis nicht wie ich das machen soll:</p>
<p>Ich moechte in einer function einer template classe code abhaenig vom type ausfuehren indem ich mit typeid teste ob der von der gewuenschten classe ist:</p>
<pre><code class="language-cpp">template &lt;class Type&gt; class  ClassName
 {
...
 public: void DoSomething(Type * Data)
  {
  if(typeid(Data) == typeid(ClassWantedToBe*)) ...;

  }
 }
</code></pre>
<p>Das funktioniert auch so, ABER jetzt ist die ClassWantedToBe auch ein template, so funtioniert es mit</p>
<pre><code class="language-cpp">...
if(typeid(Data) == typeid(ClassWantedToBe&lt;SpecialType&gt;*)) ...;
...
</code></pre>
<p>Jetzt mein Problem: ich moechte den selben test machen, aber ohne zu wissen wie das tempalte ClassWantedToBe benutzt wurde. Ich will testen ob Data von type ClassWantedToBe ist unabhaening vom SpecialType, meint:</p>
<pre><code class="language-cpp">if(typeid(Data) == typeid(ClassWantedToBe&lt;??&gt;*))...
</code></pre>
<p>ich moechte true wenn Data von dem template ClassWantedToBe kommt egal mit welchem type das template benuzt wurde. (also ist mir egal was ?? ist, hauptsache irgendein type von ClassWantedToBe&lt;..&gt; ) Wie geht das?</p>
<p>Vielen Dank fuer Hinweise</p>
<p>Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941570</guid><dc:creator><![CDATA[Flow_cplus]]></dc:creator><pubDate>Wed, 14 Dec 2005 05:50:22 GMT</pubDate></item><item><title><![CDATA[Reply to typeid und templates on Wed, 14 Dec 2005 09:23:28 GMT]]></title><description><![CDATA[<p>Verpasse der Klasse ClassWantedToBe eine Funktion z.B. GetType () und frage diese anstelle der Klassen-ID ab.</p>
<p>Ansonsten ist das hier:</p>
<pre><code class="language-cpp">if(typeid(Data) == typeid(ClassWantedToBe*))
</code></pre>
<p>nicht so schön. Man sollte solche Ausnahmebehandlungen soweit wie möglich vermeiden. Wenn dein Template mit der Schnittstelle von Type arbeiten soll, dann sollte sie auch nur diese verwenden.<br />
Sowas löst man besser mit einer virtuellen Funktion in Type. Diese in der Funktion ClassWantedToBe ueberschreiben und im Template aufrufen. Dann verhält sich dein Template in Abhängigkeit vom wirklichen Objekttyp anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941688</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 14 Dec 2005 09:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to typeid und templates on Wed, 14 Dec 2005 09:37:45 GMT]]></title><description><![CDATA[<p>Bist du darauf angewiesen, dies mit Laufzeitinformationen zu machen? Ansonsten gibt es in C++ bessere Möglichkeiten, zB das Strategy Pattern.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;class T&gt;
class foo
{
};

// Spezialisierungen für diverse T's deiner Klasse
template &lt;class T&gt;
struct A_strategy;

template &lt;&gt;
struct A_strategy&lt;int&gt;
{
	static void apply()
	{
		std::cout &lt;&lt; &quot;ein int&quot; &lt;&lt; std::endl;
	}
};

template &lt;&gt;
struct A_strategy&lt;foo&lt;int&gt; &gt;
{
	static void apply()
	{
		std::cout &lt;&lt; &quot;ein foo&lt;int&gt;&quot; &lt;&lt; std::endl;
	}
};

template &lt;class T&gt;
struct A_strategy&lt;foo&lt;T&gt; &gt;
{
	static void apply()
	{
		std::cout &lt;&lt; &quot;ein foo&lt;T&gt;&quot; &lt;&lt; std::endl;
	}
};

// deine Klasse
template &lt;class T&gt;
class A
{
public:
	void do_something(T* data)
	{
		A_strategy&lt;T&gt;::apply();
	}
};

int main()
{
	A&lt;int&gt; a;
	a.do_something(0);
	A&lt;foo&lt;int&gt; &gt; b;
	b.do_something(0);
	A&lt;foo&lt;char&gt; &gt; c;
	c.do_something(0);
	return 0;
}
</code></pre>
<p>Des Problems Lösung hier heisst Spezialisierung, imo die vernünftigste Vorgehensweise, wenn du mit Templates arbeitest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941703</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 14 Dec 2005 09:37:45 GMT</pubDate></item></channel></rss>