<?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[Verschiedene Typen aus generischer Methode zurückgeben]]></title><description><![CDATA[<p>Ich habe den Fall, dass ich aus ein und derselben generischen Methode (auch generischem Rückgabetyp) je nach Eingabe Ausgaben verschiedener Typen zurückgebe. Alle möglichen Ausgaben sind Klassen. Beim Kompilieren bekomme ich aber jetzt Warnungen C4927 angezeigt, dass mehr als eine implizite Konvertierung angewendet wurde. Logisch: Wenn ich halt (bspw.) die generische Methode mit Typ float aufrufe, und eine andere mögliche Ausführung der Methode aber halt int zurückgibt, muss konvertiert werden. Bei einfachen Datentypen geht das noch, aber weil ich halt Klassen benutze, die mit mehr als einer Kovertierung ineinander zu verwandeln zu sind, gibt es diese Warnung.</p>
<p>Wie kann ich denn das verhindern? Die Klassen umzuschreiben ist hier jedenfalls keine Option.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224224/verschiedene-typen-aus-generischer-methode-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 14:28:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224224.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Oct 2008 10:16:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 07 Oct 2008 10:16:57 GMT]]></title><description><![CDATA[<p>Ich habe den Fall, dass ich aus ein und derselben generischen Methode (auch generischem Rückgabetyp) je nach Eingabe Ausgaben verschiedener Typen zurückgebe. Alle möglichen Ausgaben sind Klassen. Beim Kompilieren bekomme ich aber jetzt Warnungen C4927 angezeigt, dass mehr als eine implizite Konvertierung angewendet wurde. Logisch: Wenn ich halt (bspw.) die generische Methode mit Typ float aufrufe, und eine andere mögliche Ausführung der Methode aber halt int zurückgibt, muss konvertiert werden. Bei einfachen Datentypen geht das noch, aber weil ich halt Klassen benutze, die mit mehr als einer Kovertierung ineinander zu verwandeln zu sind, gibt es diese Warnung.</p>
<p>Wie kann ich denn das verhindern? Die Klassen umzuschreiben ist hier jedenfalls keine Option.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594702</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Tue, 07 Oct 2008 10:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 07 Oct 2008 13:18:55 GMT]]></title><description><![CDATA[<p>ich sehe das Problem nicht ganz (kann dran liegen dass du keinen Code geliefert hast). Grob skizziert sieht die Situation für mich ähnlich wie folgendes aus:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct FooResult 
{
  typedef std::vector&lt;std::tr1::shared_ptr&lt;T&gt; &gt; type; //nur ein Beispiel...
};

template &lt;class T&gt;
FooResult&lt;T&gt;::type foo(T const&amp; arg)
{
  FooResult&lt;T&gt;::type res;
  res.push_back(std::tr1::shared_ptr&lt;T&gt;(new T(arg));
  return res;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1594833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594833</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Oct 2008 13:18:55 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 07 Oct 2008 13:35:50 GMT]]></title><description><![CDATA[<p>Sorry, verstehe deinen Code nicht. Aber dein Einwand erscheint plausibel. Daher folgendes:</p>
<pre><code class="language-cpp">template &lt;class TYPE&gt;
TYPE TheClass&lt;TYPE&gt;::method(int input) {
    switch (input) {
        case 0: return 4.0f; break; // float
        case 1: return 7; break; // int
        default: return &quot;error&quot;; break; // char*
    }
}
</code></pre>
<p>So sieht's im Wesentlichen aus, nur halt mit Klassen, die sich zwar ineinander casten lassen, aber halt mit mehr als einer impliziten Kovertierung, demzufolge mir dann die Warnung ausgegeben wird, wenn ich bspw. die ganze Klasse auf float angelegt habe, aber hier jetzt z.B. ein int zurückgegeben werden muss. Das Problem ist halt, dass hier der Typ der Ausgabe nicht mit dem Typ des generischen Objektes zusammenhängen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594855</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Tue, 07 Oct 2008 13:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 07 Oct 2008 14:10:07 GMT]]></title><description><![CDATA[<p>Ah mit dem Code versteht man schon mehr. Das Problem besteht nicht in der generischen Methode (hat damit nicht viel zu tun) sondern darin, dass du je nach Eingabe völlig inkompatible Typen zurückgibst, die zusätzlich auch nicht zum erwarteten Rückgabetyp passen. Da fragt sich was du damit erreichen willst, denn wenn du mal ein int, mal einen C-Strng zurückgibst, wie soll der Aufrufer das verarbeiten können?<br />
Es sei denn du möchtest tatsächlich wie der Funktionskopf vermuten lässt ein Objekt vom Typ TYPE zurückgeben und das mit dem entsprechenden Wert initialisieren - dazu muss TYPE aber den jeweiligen Konstruktor implementiert haben (fragt sich allerdings wiederum, wie sinnvoll das dann ist...), sprich: wenn du TheClass&lt;Foo&gt;::method aufrufen willst, muss Foo 3 Ctoren haben die jeweils einen int, ein float bzw. einen const char* als Parameter akzeptieren.<br />
Eventuell ist auch sinnvoll, die Konvertierung in den Rückgabetyp explizit zu machen:</p>
<pre><code class="language-cpp">...

        case 0: TYPE t(4.0f); return t; break; // float
        case 1: TYPE t(7); return t; break; // int
        default: TYPE t(&quot;error&quot;); return t; break; // char*
</code></pre>
<p>btw: hinter einem return ist ein break unnötig, da es nie erreicht wird (Java wäre da z.B. streng und würde unerreichbaren anprangern)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594879</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Oct 2008 14:10:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 07 Oct 2008 19:00:00 GMT]]></title><description><![CDATA[<p>David Schneider schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">template &lt;class TYPE&gt;
TYPE TheClass&lt;TYPE&gt;::method(int input) {
    switch (input) {
        case 0: return 4.0f; break; // float
        case 1: return 7; break; // int
        default: return &quot;error&quot;; break; // char*
    }
}
</code></pre>
<p>...</p>
</blockquote>
<p>Ich denke, Du suchst an der falschen Stelle nach einer Lösung.<br />
1.) Erstmal passen templates (=Typbestimmung zur Compilezeit) nicht zu der Implementation (die seeeehr nach Typbestimmung zur Laufzeit aussieht).<br />
Mein Tipp, wenn Du das wirklich willst: union.</p>
<p>2.) mal eine Gegenfrage: Wie soll der Aufrufer diese Funktion eigentlich nutzen ? Wohin soll er das Ergebnis packen und wie nutzen ?</p>
<p>3.) Schonmal über Laufzeitpolymorphie mit &quot;virtual&quot; nachgedacht ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595067</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 07 Oct 2008 19:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 07 Oct 2008 22:12:57 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>ich sehe das Problem nicht ganz (kann dran liegen dass du keinen Code geliefert hast). Grob skizziert sieht die Situation für mich ähnlich wie folgendes aus:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct FooResult 
{
  typedef std::vector&lt;std::tr1::shared_ptr&lt;T&gt; &gt; type; //nur ein Beispiel...
};

template &lt;class T&gt;
FooResult&lt;T&gt;::type foo(T const&amp; arg)
{
  FooResult&lt;T&gt;::type res;
  res.push_back(std::tr1::shared_ptr&lt;T&gt;(new T(arg));
  return res;
}
</code></pre>
</blockquote>
<p>Da fehlt ein &quot;typename&quot;. Also zwischen &quot;template &lt;class T&gt;&quot; und &quot;FooResult&lt;T&gt;::type&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595179</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Oct 2008 22:12:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Tue, 21 Oct 2008 14:37:13 GMT]]></title><description><![CDATA[<p>Eigentlich gebe ich nicht wirklich völlig verschiedene Typen zurück. Für ein und dieselbe Instanz der Klasse wird immer ein Wert desselben Typs zurückgebgeben, der dann auch dem Typ der Klasse entspricht. Dazu habe ich ein mode-Attribut (welches in meinem Code hier weiter unten als der Parameter auftaucht), dass immer in den richtigen Zweig leitet. Es geht also auch nicht um Typbestimmung zur Laufzeit, weil ich durchaus schon beim Kompilieren angebe, von welchem Typ die Instanz sein soll.</p>
<p>Die Tatsache, dass ich hier mehrere verschiedene Typen zurückgeben lasse, liegt nur dran, dass die Klasse prinzipiell alle diese Typen zurückgeben soll. Das Problem ist dann halt, dass alle Zweige der Methode, die einen Wert von einem anderen Typ als demjenigen der Instanz zurückgeben, falsch sind.</p>
<p>Natürlich könnte ich jetzt für jeden dieser möglichen Typen eine eigene Klasse schreiben, aber das ist meiner Meinung nach nicht sinnvoll, weil die verschiedenen Methoden, den benötigten Wert zu beschaffen, sich wirklich nur haarfein voneinander unterscheiden.</p>
<p>Mir fällt im Moment keine Lösung ein, die das hier behebn könnte, außer halt oben genannter mit den mehreren Klassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602289</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Tue, 21 Oct 2008 14:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Typen aus generischer Methode zurückgeben on Wed, 22 Oct 2008 08:13:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Natürlich könnte ich jetzt für jeden dieser möglichen Typen eine eigene Klasse schreiben, aber das ist meiner Meinung nach nicht sinnvoll, weil die verschiedenen Methoden, den benötigten Wert zu beschaffen, sich wirklich nur haarfein voneinander unterscheiden.</p>
</blockquote>
<p>Schau die mal Policy-based Design an. Mit dem kannst du für das gleiche Objekt gewisse Feinheiten &quot;ändern&quot;. Du schreibst dir dann lediglich eine Grundklasse und kannst dann zur Compile Zeit angeben was er vlt. anderst machen soll. (Das übergibst du dann als Templateparameter).</p>
<p><a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">http://en.wikipedia.org/wiki/Policy-based_design</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602642</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 22 Oct 2008 08:13:09 GMT</pubDate></item></channel></rss>