<?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[überprüfen von template variable auf bestimmten typ]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Frage bezüglich Templates.<br />
Ich weiß jetzt nicht, ob das schon irgendwo geklärt wurde, falls ja, tuts mir leid, habe mich auch schon ein wenig mit der Suche abgetan.<br />
Ich wollte lediglich wissen, ob ich irgendwie den Typ einer Template-Variablen überprüfen kann, also so was zum Beispiel:</p>
<pre><code class="language-cpp">template &lt;typename T, typename T1&gt;
T ConvertFrom (T1 val)
{
	if(T1 == int)
	{
		std::cout&lt;&lt;&quot;integer&quot;&lt;&lt;std::endl;
	}
}
</code></pre>
<p>Der Rückgabe-Wert ist egal, den benötige ich für später, aber geht das prinzipiell?</p>
<p>thx so far</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197767/überprüfen-von-template-variable-auf-bestimmten-typ</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 19:42:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197767.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Nov 2007 15:45:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 15:45:08 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Frage bezüglich Templates.<br />
Ich weiß jetzt nicht, ob das schon irgendwo geklärt wurde, falls ja, tuts mir leid, habe mich auch schon ein wenig mit der Suche abgetan.<br />
Ich wollte lediglich wissen, ob ich irgendwie den Typ einer Template-Variablen überprüfen kann, also so was zum Beispiel:</p>
<pre><code class="language-cpp">template &lt;typename T, typename T1&gt;
T ConvertFrom (T1 val)
{
	if(T1 == int)
	{
		std::cout&lt;&lt;&quot;integer&quot;&lt;&lt;std::endl;
	}
}
</code></pre>
<p>Der Rückgabe-Wert ist egal, den benötige ich für später, aber geht das prinzipiell?</p>
<p>thx so far</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403182</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 14 Nov 2007 15:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 15:48:27 GMT]]></title><description><![CDATA[<p>Mmmh, ich häng mich mal mit dran, ich hoffe du hast nix dagegen :D.<br />
In dem Zuzsammenhang würde mich auch mal interessieren, ob man bei einem Template irgendwie zur Kompilierzeit nur best. Datentypen zulassen kann, wie int, float, double, char etc.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403186</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 14 Nov 2007 15:48:27 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 16:20:58 GMT]]></title><description><![CDATA[<p>ich weiß jetzt nicht, ob das Folgende richtig ist, bräuchte da mal ne Info dazu.<br />
In einem anderen Board habe ich eine Info zur RTI (Run Time Information) gefunden:</p>
<pre><code class="language-cpp">#include &lt;typeinfo&gt;
if(typeid(T) == typeid(int)) //...
</code></pre>
<p>bräuchte mal bitte Feedback dazu, ist das richtig so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403196</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 14 Nov 2007 16:20:58 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 16:35:24 GMT]]></title><description><![CDATA[<p>Dafür verwendet man sogenannte &quot;Type Traits&quot;. Boost z.B. hat eine Menge von vordefinierten Type Traits, z.B. is_pointer, is_pod etc.<br />
<a href="http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_typetraits.html" rel="nofollow">http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_typetraits.html</a></p>
<p>P.S. RTTI kannst du generell auch verwenden, sollte aber eigentlich bei Templates nicht angewendet werden (da templates ja zur Kompilierzeit schon ausgewertet werden - und der Overhead bei RTTI ziemlich groß ist).</p>
<p>Wenn du bei einer Template-Funktion Sonderfälle betrachten willst, dann erzeuge für diese Funktion eine (partiell-) spezialisierte Version, z.B.</p>
<pre><code class="language-cpp">template&lt;typename R, typename T&gt;
R Convert(T t)
{
  return R(t);
}

template&lt;typename R, int&gt;
R convert(int i)
{
  cout &lt;&lt; &quot;integer: &quot; &lt;&lt; i;
  return R(i);
}
</code></pre>
<p>Als Antwort auf die Frage von Scorcher:<br />
Wenn du nur bestimmte Datentypen zulassen willst, dann erzeugst du einfach in der allgemeinen Template-Definition einen Fehler, z.B.</p>
<pre><code class="language-cpp">template&lt;typename R, typename T&gt;
R Convert(T t)
{
  Error_No_Specific_Conversion_Defined!!! // &lt;- Compile-Error
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1403202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403202</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Wed, 14 Nov 2007 16:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 16:40:58 GMT]]></title><description><![CDATA[<p>hrmpf, also RTTI wär mir eigentlich schon ganz recht, weil ich mir sonst eigentlich die Templates sparen könnte und auch normal mit überladenen Methoden herumhantieren könnte, da ich auch den Rückgabewert noch überprüfen muss... Das mit den überladenen Methoden überleg ich mir derzeit auch noch parallel zu den Templates, ich weiß noch nicht was besser ist, weil wenn ich jeden Fall eines Templates spezialisiert überprüfe, dann kann ich mir das Template eigentlich sparen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403213</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 14 Nov 2007 16:40:58 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 17:12:50 GMT]]></title><description><![CDATA[<p>Dann überleg mal, was du willst: Eine Funktion nur für bestimmte Typen oder eine Funktion, die mit beliebigen Typen geht, die bestimmte Anforderungen erfüllen (d. h. z. B. auch noch unbekannte benutzerdefinierte Typen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403233</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 14 Nov 2007 17:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 17:27:00 GMT]]></title><description><![CDATA[<p>Vorden schrieb:</p>
<blockquote>
<p>hrmpf, also RTTI wär mir eigentlich schon ganz recht, weil ich mir sonst eigentlich die Templates sparen könnte ...</p>
</blockquote>
<p>Wichtig: Willst Du eine Prüfung zur Lauf- (wie bei RTTI) oder bereits zur Compilezeit (wie bei templates) ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403247</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 14 Nov 2007 17:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 17:41:21 GMT]]></title><description><![CDATA[<p>Man kann auch noch das enable_if-Konstrukt nutzen, welches von boost bereits zur Verfügung gestellt wird (siehe <a href="http://www.boost.org/libs/utility/enable_if.html" rel="nofollow">boost.enable_if</a>). Das enable_if soll wohl auch im TR1 enthalten sein.</p>
<p>Dazu ein Beispiel: mal angenommen man habe eine generische Funktion zur Berechnung der Fakultät:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
T fac( T x )
{
    return x &lt;= T(1)? T(1): x * fac( x - 1 );
}
</code></pre>
<p>Dann würde ein Ausdruck wie</p>
<pre><code class="language-cpp">double erg = fac(3.14);
</code></pre>
<p>zwar irgendwas liefern, aber keine Fakultät. Will man die Funktion nur für Integer-Typen zulassen, so schreibt man:</p>
<pre><code class="language-cpp">#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/type_traits.hpp&gt;

template&lt; typename T &gt;
typename boost::enable_if&lt; boost::is_integral&lt; T &gt;, T &gt;::type fac( T x )
{
    return x &lt;= T(1)? T(1): x * fac( x - 1 );
}
</code></pre>
<p>somit lässt sich der Ausdruck mit dem double erst gar nicht übersetzen. Und man bekommt den Compiler-Fehler nicht in der fac-Funktion sondern genau da, wo man fac(double) aufgerufen hat ... ist ein Riesenvorteil.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403255</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 14 Nov 2007 17:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 18:38:21 GMT]]></title><description><![CDATA[<p>Ich befürchte, das Essentielle ist hier untergegangen.</p>
<p>Die Antwort auf Vordens Frage lautet *nicht* RTTI (und auch nicht boost::enable_if) sondern einfach Templatespezialisierung!</p>
<p>Und dieselbe Antwort trifft auch auf Scorchers Frage zu, *falls* einfache Überladung nicht ausreichen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403288</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 14 Nov 2007 18:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Wed, 14 Nov 2007 18:48:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Das enable_if soll wohl auch im TR1 enthalten sein.</p>
<p>Dazu ein Beispiel (...)</p>
</blockquote>
<p>Alternativ dazu kann man oft auch einfach ein static asser (BOOST_STATIC_ASSERT) verwenden.</p>
<p>Wenn man mehrere Overloads hat und je nach Typ möchte dass eine bestimmte Implementierung genommen wird und die anderen für die Overload Resolution &quot;ausgeblendet werden&quot; muss man wohl (das IMO greisliche) enable_if verwenden. Wenn man dagegen z.B. nur verhindern möchte dass double/float als Template Parameter verwendet werden würde ich eher zu BOOST_STATIC_ASSERT greifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403296</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 14 Nov 2007 18:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 07:04:39 GMT]]></title><description><![CDATA[<p>also ganz naiv würd ich ja einfach mal sagen, dass die idee, einem template für verschiedene typen, verschiedene verhaltensweisen einzuprägen, die ganze template idee ad absurdum führt. schön, dass boost/tr1 da irgendwelche konstrukte für anbieten, aber wenn man mehrere methoden hat, die unterschiedliche eingabetypen erwarten und sich für die jeweiligen typen auch unterschiedlich verhalten, dann sollte man daraus auch unterschiedliche methoden machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403443</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Thu, 15 Nov 2007 07:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 08:32:50 GMT]]></title><description><![CDATA[<p>Zu Ths Code. Ich dachte immer Funktionen kann man nicht partiell spezialisieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403473</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 15 Nov 2007 08:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 08:33:25 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>also ganz naiv würd ich ja einfach mal sagen, dass die idee, einem template für verschiedene typen, verschiedene verhaltensweisen einzuprägen, die ganze template idee ad absurdum führt.</p>
</blockquote>
<p>Nein, tut sie nicht, im Gegenteil:</p>
<p>Templates implementieren zwar das Prinzip der Generalität, also der Abstraktion. Aber dieses Prinzip ist untauglich, wenn es sich nicht mit Spezialisierung verbinden lässt. Das wird offensichtlich, wenn man sich den std::distance-Algorithmus anschaut. std::distance ermittelt den Abstand zweier Iteratoren. Der Algorithmus ist generisch, d.h. er funktioniert mit jedem Iterator-Typ. Allerdings ist essenziell, dass er je nach Iteratortyp unterschiedlich implementiert wird, weil er sonst in häufigen Fällen ineffizient ist. Und wenn der Algorithmus ineffizient wäre, dann würde man ihn natürlich nicht verwenden, und damit wäre die Generalität des Algorithmus' untauglich.</p>
<p>Daher ist std::distance für Random-Access-Iteratoren durch Zeigerarithmetik (Subtraktion) implementiert und für andere Iteratoren über eine Schleife.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403474</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 15 Nov 2007 08:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 08:39:20 GMT]]></title><description><![CDATA[<p>Hmm, naja von meiner Seite aus ist es eigentlich gelöst, weil ich irgendwie gestern auch nicht mehr so genau gewusst hatte, was ich eigentlich wollte...<br />
Ich wollte eigentlich Konvertierungsfunktionen, wie ToInt oder so was...<br />
Da das ganze immer aus einem std::string kommt (und man es recht simpel, vllt mit Überprüfungen mittels eines std::stringstream s umwandeln kann in den entsprechenden Typen) hat sich das ganze eigentlich inzwischen für mich erledigt... Weiß jetzt auch nicht, warum ich so auf dem Schlauch gestanden war..., habe jetzt die Operatoren überladen, also z.b.</p>
<pre><code class="language-cpp">operator int ();
operator double ();
</code></pre>
<p>Das war glaub ich eigentlich das, wonach ich gesucht hatte, wobei ich mir das (selbst) nochmal überlegen muss...<br />
Btw was liefert denn ein std::stringstream, wenn die Konvertierung von/in einen Datentyp nicht klappt, Exception oder irgendwelche Errorcodes?<br />
Also wenn ich z.B. so was habe (jetzt wieder mit Templates):</p>
<pre><code class="language-cpp">template&lt;typename T, typename T1&gt;
T ConvertFromTo (T1 val)
{
    std::stringstream temp(val);
    T retVal;
    temp &gt;&gt; retVal;
    return retVal;
}
</code></pre>
<p>Wird das mir bei nativen Typen immer eine richtige und sinnvolle Konversion durchführen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403476</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Thu, 15 Nov 2007 08:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 09:29:33 GMT]]></title><description><![CDATA[<p>Vorden schrieb:</p>
<blockquote>
<p>...habe jetzt die Operatoren überladen, also z.b.</p>
<pre><code class="language-cpp">operator int ();
operator double ();
</code></pre>
<p>Das war glaub ich eigentlich das, wonach ich gesucht hatte, wobei ich mir das (selbst) nochmal überlegen muss...</p>
</blockquote>
<p>Mit diesen Operatoren kann man sich ins eigene Bein schießen, und stundenlang Fehler suchen. Du solltest zumindest immer aufpassen wenn du mit diesen srbeitest, da in manchen Fällen die Umwandlung vielleicht doch nicht gewollt ist (Auch wenn ich nicht unbedingt Methoden wie &quot;ToString&quot; mag, so haben die doch einen ganz entschiedenen Vorteil: Man muss sie explizit aufrufen).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403492</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 15 Nov 2007 09:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 09:43:28 GMT]]></title><description><![CDATA[<p>Vorden schrieb:</p>
<blockquote>
<p>Btw was liefert denn ein std::stringstream, wenn die Konvertierung von/in einen Datentyp nicht klappt, Exception oder irgendwelche Errorcodes?</p>
</blockquote>
<p>Der Stream setzt das failbit, das du bei Bedarf auswerten kannst, um darauf zu reagieren. Alternativ kannst du ihn auch anweisen, bei Fehlern eine Exception (Typ ios_base::failure) zu werfen, indem du vorher <code>temp.exceptions(ios::failbit);</code> aufrufst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403496</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Nov 2007 09:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 11:57:41 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>also ganz naiv würd ich ja einfach mal sagen, dass die idee, einem template für verschiedene typen, verschiedene verhaltensweisen einzuprägen, die ganze template idee ad absurdum führt. schön, dass boost/tr1 da irgendwelche konstrukte für anbieten, aber wenn man mehrere methoden hat, die unterschiedliche eingabetypen erwarten und sich für die jeweiligen typen auch unterschiedlich verhalten, dann sollte man daraus auch unterschiedliche methoden machen.</p>
</blockquote>
<p>Mmh, finde ich nicht. Mein Fall:<br />
Ich hab 3 Vectoren geschrieben. Die sind aber keine Container, sondern eben mathematische Vektoren-Klassen. Jetzt macht es natürlich wenig sinn, so einem Vector als Typ beispielsweise string zuzuordnen.<br />
Meine Frage zielt darauf ab, dass ich zur Kompilierzeit solche Fehler vom Anwender gleich als Compilererror anzeigen kann.<br />
Klar, man kann den Vector auch mit einem festen Typ anlegen, aber ich hab ehrlicherweise wenig Lust, das für int, double und float jeweils extra anzulegen.<br />
Man kanns auch dem Verwender der API überlassen, aber naja, ich dachte da kann man halt die Verwendung etwas optimieren und solche &quot;Fehler&quot; gleich aufzeigen. <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="😉"
    /><br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403573</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 15 Nov 2007 11:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 12:09:52 GMT]]></title><description><![CDATA[<p>Die einfachste Lösung ist es, (direkt oder indirekt) das Interfaces der verwendeten Typen einzuschränken - z.B. um zwei Vektoren multiplizieren zu können, muß der verwendete Basistyp einen operator* zur Verfügung stellen.</p>
<p>Der direkte Weg bedeutet, daß du einfach in der Vektor-Mutliplikation auf die Element-Multiplikation zurückgreifst - wenn der verwendete Typ kein hat, beschwert sich der Compiler mit entsprechenden (zugegeben - mitunter etwas kryptischen) Fehlermeldungen. Etwas klarer werden die Fehlermeldungen, wenn du STATIC_ASSERT und ähnliche Hilfsmittel aus der Boost-Bibliothek verwendest (irgendwo habe ich auch eine Hilfsbibliothek gesehen, mit denen du dem Template Typ-Anforderungen mitgeben kannst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403580</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Nov 2007 12:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 12:31:59 GMT]]></title><description><![CDATA[<p>Es gibt da z.Bsp. bei den type_traits is_arithmetic</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403597</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 15 Nov 2007 12:31:59 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 14:04:18 GMT]]></title><description><![CDATA[<p>hrmpf... nochmal zum Problem zurück, ich zerbrech mir dabei irgendwie den Kopf...<br />
Ich habe eine Basisklasse (die soll nach Möglichkeit NICHT template basiert sein).<br />
In dieser soll eine Konvertierungsfunktion angeboten werden (welche auch gerne generisch sein darf). Allerdings lege ich in der Basisklasse noch nicht fest, dass es überhaupt einen Wert gibt (welcher später mit der Konvertierungsfunktion umgewandelt werden soll). Da leider template Methoden nicht virtual sein dürfen, ist das für mich irgendwie ein Problem, da ich ja, wenn ich einen Pointer wie folgt anlege:</p>
<pre><code class="language-cpp">Base * temp = new Derived();
</code></pre>
<p>und anschließend</p>
<pre><code class="language-cpp">int c = temp-&gt;Convert();
</code></pre>
<p>aufrufe, die Konvertierungsfunktion der Oberklasse aufgerufen kriege... Das will ich allerdings um jeden Preis vermeiden, da jede neue Klasse auch ihre eigenen Konvertierungsfunktionen haben soll und dann auch diese aufgerufen werden sollen. Mit void * könnte ich zwar zum Ziel kommen, allerdings sind hierbei dann die Hin - und Rückkonvertierungen jeweils auch zwecks Typprüfung relativ aufwendig. Ich hoffe, dass es dafür irgendeine Lösung gibt (die mir allerdings derzeit ein wenig schleierhaft ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403677</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Thu, 15 Nov 2007 14:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 14:49:56 GMT]]></title><description><![CDATA[<p>Wenn jede der abgeleiteten Klassen ihren eigenen Typ zurückgeben soll, wirst du nur schwer eine gemeinsame Schnittstelle finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403718</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Nov 2007 14:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 15:04:35 GMT]]></title><description><![CDATA[<p>sie soll ja nicht ihren eigenen Typen zurückgeben, eigentlich sollen ALLE long und double unterstützen (also für den Anfang)...<br />
Wenn das ganze jetzt allerdings erweitert werden soll, dass alle nativen Datentypen unterstützt werden sollen, dann hieße das, dass es dabei auch ein ziemliches durcheinander gibt. Ich habe derzeit auch noch das Problem, dass es eigentlich gar keinen Wert so direkt gibt in der Basis-Klasse, der Wert kommt erst in der abgeleiteten Klasse hinzu, von daher kann ich das ganze auch nicht ausimplementieren. Für mich wäre es ja schon genug, wenn ich eine Funktionsdeklaration finden könnte, die allgemein genug ist, dass ich in der abgeleiteten Klasse anschließend mit Templates arbeiten kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403734</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Thu, 15 Nov 2007 15:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 15:26:38 GMT]]></title><description><![CDATA[<p>Schon allein das long und double unterstützt werden soll, ist schon problematisch. Und was heißt &quot;ALLE&quot;???</p>
<p>Irgendwie ganz schön strange was du da machen willst. Man könnte höchstens über boost::any nachdenken. Oder wenn es keine Templates sein dürfen, mußt du halt ein void* zurück geben, und derjenige muß casten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403765</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 15 Nov 2007 15:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 15:55:39 GMT]]></title><description><![CDATA[<p>das mit dem void * habe ich mir auch schon überlegt, nur das mit dem Cast finde ich halt ein wenig schwierig, vor Allem in Richtung setzen (so mit Typprüfung)...<br />
ALLE bedeutet, dass alle erbenden Klassen die Konvertierungsmöglichkeiten prinzipiell unterstützen sollen.<br />
Jetzt habe ich mir eine Version geschrieben, die zwei Template-Parameter besitzt, in der Basisklasse und in der erbenden Klasse wird einer davon spezialisiert, allerdings erhalte ich die Fehlermeldung &quot;illegal use of explicit template arguments&quot;. Gibt es da eine Möglichkeit das zu lösen, mein Code sieht wie folgt aus:<br />
Basisklasse:</p>
<pre><code class="language-cpp">template &lt;typename T, typename T1&gt; T Convert ()
{
//...
}
</code></pre>
<p>abgeleitet:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; T Convert&lt;std::string&gt; ()
{
}
</code></pre>
<p>Allerdings geht dies nicht, ich hoffe, irgendwer kann mir nun helfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403799</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Thu, 15 Nov 2007 15:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Thu, 15 Nov 2007 17:44:40 GMT]]></title><description><![CDATA[<p>Sorry Vorden, ich hatte vergessen (so wie Braunstein richtig angemerkt hat), daß man nur Klassentemplates partiell spezialisieren kann (falls du dich von meinem Code hast inspirieren lassen?).</p>
<p>Trotzdem verstehe ich den Sinn deiner Konvertierungstemplates immer noch nicht?<br />
Wenn du einfach nur Konvertierungen nach String- und zurück brauchst, dann würde ich über die Stringstreams gehen:</p>
<pre><code class="language-cpp">template&lt;class T&gt; string toStr(const T&amp; t)
{
	std::ostringstream str;

	str &lt;&lt; t;

	return str.str();
}

template&lt;class T&gt; T fromStr(const string&amp; s, const T&amp; def = T())
{
	std::istringstream str(s);
	T t = def;

	str &gt;&gt; t;

	return t;
}
</code></pre>
<p>Ansonsten müßtest du für beliebige Datentypen die Funktion 'Convert' mit den jeweiligen Datentypen überladen (jedoch darf sich die Funktion nicht alleine im Rückgabewert unterscheiden, d.h. &quot;int Convert()&quot; und &quot;float Convert()&quot; geht nicht!!!).</p>
<p>Alternativ müßtest du dann jeweils eine Klasse (bzw. Struktur) darum packen:</p>
<pre><code class="language-cpp">template&lt;typename R&gt;
struct Convert
{
  template &lt;typename T&gt;
  static R Do(T t) { return R(t); }
};

// Aufruf, z.B.
int x = Convert&lt;int&gt;::Do(42.123f);
</code></pre>
<p>Du könntest jetzt dann entsprechend des Rückgabetypes spezialisieren:</p>
<pre><code class="language-cpp">template&lt;&gt;
struct Convert&lt;int&gt;
{
  template &lt;typename T&gt;
  static int Do(T t) { std::cout &lt;&lt; t; return int(t); }

  static int Do(std::string s) { return 0; } // Überladung
};

// Aufruf z.B.
int x = Convert&lt;int&gt;::Do(42.123f); // float-&gt;int
int y = Convert&lt;int&gt;::Do(std::string(&quot;hallo&quot;)); // string-&gt;int
</code></pre>
<p>Mehr fällt mir aber auch nicht mehr ein und ich hoffe, ich habe dich (in Ansätzen) richtig verstanden, was du vorhast???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403864</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 15 Nov 2007 17:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to überprüfen von template variable auf bestimmten typ on Fri, 16 Nov 2007 08:15:39 GMT]]></title><description><![CDATA[<p>jo, schon, das mit der Spezialisierung ist soweit richtig, allerdings bleibt das Problem dabei trotzdem bestehen, dass ich mit virtual nicht weiter komme... und das ist genau das, was ich bräuchte. Habe es jetzt wie folgt gelöst:<br />
Ich habe ein allgemeines Template und in der abgeleiteten Klasse die entsprechend spezialisierten Templates. Ich hoffe, dass das den gewünschten Effekt bringt. Das mit der partiellen Spezialisierung habe ich inzwischen auch gefunden, also, dass es lediglich auf Klassenebene möglich ist. Habe mir auch irgendwie ein Interface überlegt, welches entsprechend angebunden wird als &quot;Converter&quot; und dann eben &quot;DoConvert&quot; des entsprechenden Interfaces aufgerufen wird. Das muss ich mir nochmal durch den Kopf gehen lassen, ob die direkte Implementierung oder der Weg über das Interface sinnvoller sind.<br />
Intern soll auch die Konvertierung über die stringstreams ablaufen, nur der Punkt daran ist eben, dass ich die Konvertierung vom Anwender fernhalten wollte und möglichst generisch halten wollte (das ganze bezieht sich auf eine Bibliotheksfunktion, die später von Entwicklern in der Firma benutzt werden soll).<br />
Von daher wollte ich das mit den stringstreams weg kapseln, wenn jetzt eine &quot;bool ReadInt (int * val)&quot; aufruft, soll er halt auch sein int kriegen (dass es sich um ein bool handelt als Rückgabewert und nicht der Wert als Rückgabewert angegeben wird, hat andere Gründe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404104</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Fri, 16 Nov 2007 08:15:39 GMT</pubDate></item></channel></rss>