<?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-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst)]]></title><description><![CDATA[<p>Hallo,</p>
<p>aktuell spiele ein bisschen mit Templates und tappe in die Falle, dass Templates != Generische Typen sind. Hier mal ein Beispielcode, den ich nicht zum Laufen kriege:</p>
<pre><code class="language-cpp">class Foo {
public:
    template&lt;typename _Ty&gt;
    _Ty get(bool b) {
        if(b)
            return this-&gt;s;
        else
            return this-&gt;i;
    }

private:
    string s;
    int i;
};

int main() {
    Foo *f = new Foo;
    // unabhängig von den Werten in den Variablen:
    f-&gt;get&lt;string&gt;(true);    // Fehler, da Foo::s string ist, aber Foo::i nicht!
    f-&gt;get&lt;int&gt;(false);      // Genau umgekehrt!
}
</code></pre>
<p>Den Fehler verstehe ich ja, aber habt ihr Rat, wie man das elegant mit dem Typecasting umsetzen kann? Weil ich eigentlich tatsächlich das Zurückbekommen will, was ich auch als Templateparameter angebe.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287040/template-basierende-funktion-mit-typecasting-quot-generika-quot-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 14:40:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287040.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 May 2011 20:59:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 10:56:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>aktuell spiele ein bisschen mit Templates und tappe in die Falle, dass Templates != Generische Typen sind. Hier mal ein Beispielcode, den ich nicht zum Laufen kriege:</p>
<pre><code class="language-cpp">class Foo {
public:
    template&lt;typename _Ty&gt;
    _Ty get(bool b) {
        if(b)
            return this-&gt;s;
        else
            return this-&gt;i;
    }

private:
    string s;
    int i;
};

int main() {
    Foo *f = new Foo;
    // unabhängig von den Werten in den Variablen:
    f-&gt;get&lt;string&gt;(true);    // Fehler, da Foo::s string ist, aber Foo::i nicht!
    f-&gt;get&lt;int&gt;(false);      // Genau umgekehrt!
}
</code></pre>
<p>Den Fehler verstehe ich ja, aber habt ihr Rat, wie man das elegant mit dem Typecasting umsetzen kann? Weil ich eigentlich tatsächlich das Zurückbekommen will, was ich auch als Templateparameter angebe.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066584</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 21 May 2011 10:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Fri, 20 May 2011 21:14:10 GMT]]></title><description><![CDATA[<p>Eine Funktion kann nur einen Rückgabetyp haben - und eine Funktion, die wahlweise zwei grundsätzlich inkompatible Typen zurückgeben könnte, wird nicht viel Sinn machen. (stell dir mal vor, was <code>get&lt;string&gt;(true)</code> liefern sollte ;))</p>
<p>Kannst du mal erläutern, was du mit dem Code (inhaltlich) erreichen willst - vielleicht können wir dann bessere Lösungen anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066586</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 20 May 2011 21:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Fri, 20 May 2011 21:24:48 GMT]]></title><description><![CDATA[<p>Aktuell sollen verschiedene Objekte datenbankähnlich serialisiert werden. Dazu habe ich eine Database Abstraction Layer und versuche mich am ersten Teil: everything-in-memory. Die Klasse Table (in Wirklichkeit ist es keine -.-&quot;) bekommt dann gesagt, welchen Typen sie aufzunehmen hat (Bsp.: User*) und in welcher Datenstruktur das gehandled wird:</p>
<pre><code class="language-cpp">template&lt;template&lt;typename&gt; class Container, typename Type&gt;
class Table {
private:
    Container&lt;Type&gt; *data;
/* ... */
};
</code></pre>
<p>Jedoch versuche ich die einzelnen Klassen, aus denen <em>persistente</em> Objekte erstellt werden, weiter zu abstrahieren, dass man nicht auf Properties/Variablen zugreifen muss sondern theoretisch gesehen Calls wie den folgenden machen könnte:</p>
<pre><code class="language-cpp">userObjectOutOfATable-&gt;get&lt;string&gt;(User::Name);
</code></pre>
<p>wobei das <code>User::Name</code> aus einer Enumeration kommt und ich so (anstatt einen String zu übergeben) sagen kann welche Variable etc. ich gerade will. Dies möchte ich dann so beispielsweise in einem Interface <code>IPersistentObject</code> unterbringen, falls es denn klappen sollte und andererseits eine gute Idee ist.</p>
<p>Ist so klarer geworden, was ich aktuell bezwecken möchte? (Auch wenn es Komplikationen bei den Rückgabetypen gäbe, wenn der Programmieren genau aufpasst, was er macht sollte es doch egal sein xD) Gäbe es nicht eine Möglichkeit die anderen Codepfade on-the-fly zu &quot;fake&quot;casten? Aufruf einer Casting-Funktion die je nach Typ einfach <code>return NULL</code> oder so macht xD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066593</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 20 May 2011 21:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Fri, 20 May 2011 22:50:47 GMT]]></title><description><![CDATA[<p>Schau dir mal die Bibliothek <em>Boost.Any</em> an.</p>
<p>Damit könntest du eine <code>std::map&lt;TypeEnum, boost::any&gt;</code> haben und versuchen, <code>boost::any_cast</code> auf die Map-Einträge anzuwenden. Im Fehlerfall (Eintrag nicht gefunden oder falscher Typ) wird ein Nullzeiger zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066608</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 20 May 2011 22:50:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 07:06:00 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Schau dir mal die Bibliothek <em>Boost.Any</em> an.</p>
<p>Damit könntest du eine <code>std::map&lt;TypeEnum, boost::any&gt;</code> haben und versuchen, <code>boost::any_cast</code> auf die Map-Einträge anzuwenden. Im Fehlerfall (Eintrag nicht gefunden oder falscher Typ) wird ein Nullzeiger zurückgegeben.</p>
</blockquote>
<p>Beim einem falschen Typen wird meines wissens nach eine Exception geworfen, ein bad_any_cast oder so ähnlich.<br />
Und wenn der Map-Eintrag nicht gefunden wird, wird der end-Iterator zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066631</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 21 May 2011 07:06:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 09:03:37 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Beim einem falschen Typen wird meines wissens nach eine Exception geworfen, ein bad_any_cast oder so ähnlich.</p>
</blockquote>
<p>Bei Zeigern nicht, siehe <a href="http://www.boost.org/doc/libs/1_46_1/doc/html/boost/any_cast.html" rel="nofollow">hier</a>.</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Und wenn der Map-Eintrag nicht gefunden wird, wird der end-Iterator zurückgegeben.</p>
</blockquote>
<p>Was niemanden daran hindert, in diesem Fall einen Nullzeiger zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066665</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 21 May 2011 09:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 09:21:31 GMT]]></title><description><![CDATA[<p>Das ist mir neu, danke für den Hinweis. <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/2066667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066667</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 21 May 2011 09:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 10:55:42 GMT]]></title><description><![CDATA[<p>Es funktioniert. An sich wollte ich jetzt nicht noch extra boost mit einbinden, aber was solls <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="😉"
    /> Nun muss ich mir noch eine passende Abstraktion suchen.</p>
<p>Danke nochmals!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066706</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 21 May 2011 10:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 12:13:21 GMT]]></title><description><![CDATA[<p>Du kannst <code>boost::any</code> auch mehr oder weniger nachbauen, nur gibts es halt schon fertig in Boost.</p>
<p>Was für eine Abstraktion meinst du? Du hast wahrscheinlich eine Funktion in der Art, oder?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T* GetValue(TypeEnum type);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2066738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066738</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 21 May 2011 12:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 19:56:32 GMT]]></title><description><![CDATA[<p>Mit Abstraktion meine ich, meine Klassen der persistenten Objekte so zu umschreiben um ein Interface oder eine abstrakte Klasse da herauszuziehen als Oberklasse. Zum Selberschreiben von boost::any: Ich habe es versucht, hatte aber meine Probleme xD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066924</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 21 May 2011 19:56:32 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sat, 21 May 2011 20:30:11 GMT]]></title><description><![CDATA[<p>Ich hab dir hier mal ein any geschrieben: <a href="http://ideone.com/Ye7tj" rel="nofollow">http://ideone.com/Ye7tj</a><br />
Die Sonderbehandlung von Zeigern (Zurückgeben von Nullzeigern) darfst du selbst hinzufügen, und Move-Semantiken, falls du sie brauchst, ebenfalls. <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/2066941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066941</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 21 May 2011 20:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Sun, 22 May 2011 09:28:14 GMT]]></title><description><![CDATA[<p>Ich danke dir zunächst für deine schlankere Version, die zufriedenstellend ist <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 />
Nur würde ich gerne wissen, welche Sonderbehandlungen und Move-Semantiken du meinst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2067057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2067057</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 22 May 2011 09:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template-basierende Funktion mit Typecasting? (&amp;quot;Generika&amp;quot;) (gelöst) on Mon, 23 May 2011 11:50:56 GMT]]></title><description><![CDATA[<p>Wie Nexus mich durch <a href="http://www.boost.org/doc/libs/1_46_1/doc/html/boost/any_cast.html" rel="nofollow">diesen Link</a> eines besseren belehrt hat, wird im Falle, dass man versucht in einen Zeiger zu casten, aber man den falschen Typ angibt, ein Nullzeiger zurück gegeben. Meiner Implementierung wirft einen std::bad_cast, wie bei nicht-Zeigertypen.</p>
<p>Mit Move-Semantiken ist das Feature des nächsten Standards gemeint, mit dem man teure Kopien vermeiden kann. Will ich zum Beispiel alle Elemente aus einem std::vector in einen anderen std::vector hineinbekommen, dann wird im Normalfall der alte vector kopiert und danach gelöscht. Stattdessen könnte man die Elemente direkt in den neuen vector speichern - ohne unnötige Kopie, die sehr teuer sein kann.</p>
<p>Ich habe dir einmal die Zeigerbehandlung ergänzt, ich nehme nicht an, dass du die Move-Semantiken brauchst: <a href="http://ideone.com/SxdAA" rel="nofollow">http://ideone.com/SxdAA</a><br />
Zur main: Hier wird 2 mal die selbe Adresse ausgegeben, was bedeutet, dass der Cast geglückt ist. Beim Cast auf double* wird 0 zurückgegeben, da der Typ im Objekt int* und nicht double* ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2067404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2067404</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 23 May 2011 11:50:56 GMT</pubDate></item></channel></rss>