<?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 &#x2F; typeid]]></title><description><![CDATA[<p>Hallo ^^<br />
Ich habe eine Klasse geschrieben und wollte jz auch noch eine cast-fkt einbauen, die sollte so in etwa aussehen:</p>
<p>Dazu hab ich aber mehrere Fragen:<br />
1. Versuch:</p>
<pre><code class="language-cpp">//class xyz { public:
template &lt;typename T&gt;
	T Cast (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this &lt;&lt; std::ends; //ist das std::ends eigtl nötig oder sollte ich das lieber weglassen?
			stream.seekg (std::ios_base::beg); //oder kann ich davon ausgehen, dass es immer an den Anfang &quot;gespult&quot; ist?
			T R (0);
			stream &gt;&gt; R;
			return R;
		}
</code></pre>
<p>Jz gibt es nat. Probleme bei 'char *'<br />
Also mein zweiter Versuch:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
	T Cast (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this &lt;&lt; std::ends;
			stream.seekg (std::ios_base::beg);
			if (typeid (T) == typeid (char *))
				{
					std::string hlp = stream.str ();
					char *R = new char[hlp.length ()+1];
					strcpy_s (R, hlp.length (), hlp.c_str ());
					return R;
				}
				else
					{
						T R (0);
						stream &gt;&gt; R;
						return R;
					}
		}
</code></pre>
<p>Jz gibt es mit double (und wahrscheinlich auch jedem anderen Typ Probleme -.-<br />
Also habe ich das versucht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
	T Cast (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this &lt;&lt; std::ends;
			stream.seekg (std::ios_base::beg);
			if (typeid (T) == typeid (double))
				{
					double R;
					stream &gt;&gt; R;
					return R;
				}
			else if (typeid (T) == typeid (char *))
				{
					std::string hlp = stream.str ();
					char *R = new char[hlp.length ()+1];
					strcpy_s (R, hlp.length (), hlp.c_str ());
					return R;
				}
				else
					{
						T R (0);
						stream &gt;&gt; R;
						return R;
					}
		}
</code></pre>
<p>Und es ist genau das passiert, was ich befürchtet hatte:<br />
Er bekommt den 'Cast' jz nur noch mit double hin - alle anderen ergeben Fehler, so fern sie nicht 'automatisch' aus double gecastet bzw gewandelt werden können -.-</p>
<p>Wie stelle ich so was also am besten an?</p>
<pre><code class="language-cpp">xyz /*class*/ a ();
int b = a.Cast &lt;int&gt; ();
</code></pre>
<p>finde ich auch nicht so schön... aber wenn ich es so anstellen wöllte:</p>
<pre><code class="language-cpp">xyz /*class*/ a ();
int b = a;
</code></pre>
<p>müsste ich ja alles einzeln machen oder geht das auch iwie mit templates?</p>
<p>Danke schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/211566/template-typeid</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 07:21:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211566.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Apr 2008 14:54:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template &#x2F; typeid on Thu, 24 Apr 2008 14:54:43 GMT]]></title><description><![CDATA[<p>Hallo ^^<br />
Ich habe eine Klasse geschrieben und wollte jz auch noch eine cast-fkt einbauen, die sollte so in etwa aussehen:</p>
<p>Dazu hab ich aber mehrere Fragen:<br />
1. Versuch:</p>
<pre><code class="language-cpp">//class xyz { public:
template &lt;typename T&gt;
	T Cast (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this &lt;&lt; std::ends; //ist das std::ends eigtl nötig oder sollte ich das lieber weglassen?
			stream.seekg (std::ios_base::beg); //oder kann ich davon ausgehen, dass es immer an den Anfang &quot;gespult&quot; ist?
			T R (0);
			stream &gt;&gt; R;
			return R;
		}
</code></pre>
<p>Jz gibt es nat. Probleme bei 'char *'<br />
Also mein zweiter Versuch:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
	T Cast (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this &lt;&lt; std::ends;
			stream.seekg (std::ios_base::beg);
			if (typeid (T) == typeid (char *))
				{
					std::string hlp = stream.str ();
					char *R = new char[hlp.length ()+1];
					strcpy_s (R, hlp.length (), hlp.c_str ());
					return R;
				}
				else
					{
						T R (0);
						stream &gt;&gt; R;
						return R;
					}
		}
</code></pre>
<p>Jz gibt es mit double (und wahrscheinlich auch jedem anderen Typ Probleme -.-<br />
Also habe ich das versucht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
	T Cast (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this &lt;&lt; std::ends;
			stream.seekg (std::ios_base::beg);
			if (typeid (T) == typeid (double))
				{
					double R;
					stream &gt;&gt; R;
					return R;
				}
			else if (typeid (T) == typeid (char *))
				{
					std::string hlp = stream.str ();
					char *R = new char[hlp.length ()+1];
					strcpy_s (R, hlp.length (), hlp.c_str ());
					return R;
				}
				else
					{
						T R (0);
						stream &gt;&gt; R;
						return R;
					}
		}
</code></pre>
<p>Und es ist genau das passiert, was ich befürchtet hatte:<br />
Er bekommt den 'Cast' jz nur noch mit double hin - alle anderen ergeben Fehler, so fern sie nicht 'automatisch' aus double gecastet bzw gewandelt werden können -.-</p>
<p>Wie stelle ich so was also am besten an?</p>
<pre><code class="language-cpp">xyz /*class*/ a ();
int b = a.Cast &lt;int&gt; ();
</code></pre>
<p>finde ich auch nicht so schön... aber wenn ich es so anstellen wöllte:</p>
<pre><code class="language-cpp">xyz /*class*/ a ();
int b = a;
</code></pre>
<p>müsste ich ja alles einzeln machen oder geht das auch iwie mit templates?</p>
<p>Danke schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1497560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1497560</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 24 Apr 2008 14:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to template &#x2F; typeid on Thu, 24 Apr 2008 15:22:35 GMT]]></title><description><![CDATA[<p>warum sollte jemand deine objekte in char* konvertieren wollen?<br />
verbiete das, oder suche nach spezialisierung. typeid mit templates zu verwenden wird dir oft genug wahrscheinlich gar nicht kompilieren, denn stell dir mal vor, dein code wird für double instanziiert:</p>
<pre><code class="language-cpp">//dann steht im else-teil erst wieder
else
{
   char* R (0);
   stream &gt;&gt; R;
   return R;
}
</code></pre>
<p>im übrigen:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
T cast () const
{
   T rv;
   stringstream str;
   str &lt;&lt; *this;
   str &gt;&gt; rv;
   return rv;
}
</code></pre>
<p>das reicht.</p>
<p>suchwort: spezialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1497586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1497586</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 24 Apr 2008 15:22:35 GMT</pubDate></item><item><title><![CDATA[Reply to template &#x2F; typeid on Thu, 24 Apr 2008 20:59:37 GMT]]></title><description><![CDATA[<p>Danke - daraus hab ich jz also das hier gemacht:</p>
<pre><code class="language-cpp">//class xyz { public:
template &lt;typename T&gt;
	T Cast (void) const
		{
			T R; 
			std::stringstream str;
			str &lt;&lt; *this;
			str &gt;&gt; R;
			return R;
		};
template &lt; &gt;
	char* Cast &lt;char *&gt; (void) const
		{
			std::stringstream stream;
			stream &lt;&lt; *this;
			std::string hlp = stream.str ();
			const size_t l (hlp.length ()+1);
			char *R = new char[l];
			strcpy_s (R, l, hlp.c_str ());
			return R;
		};
</code></pre>
<p>Und es scheint auch ganz wunderbar zu funktionieren : &gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1497652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1497652</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 24 Apr 2008 20:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to template &#x2F; typeid on Fri, 25 Apr 2008 01:59:41 GMT]]></title><description><![CDATA[<p>es ist gefährlich.</p>
<p>warum sollte jemand, der Cast&lt;int&gt; aufruft, ein anderes verhalten bei Cast&lt;char*&gt; erwarten? (namentlich, den zeiger auch selbst löschen zu müssen)</p>
<p>verbiete lieber Cast&lt;char*&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1497860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1497860</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Fri, 25 Apr 2008 01:59:41 GMT</pubDate></item></channel></rss>