<?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[Methode und verschiedene Rückgabewerte]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende struct:</p>
<pre><code class="language-cpp">struct Data
{
    bool bData;
    float fData;
    uint nData;
};
</code></pre>
<p>und einen enum:</p>
<pre><code class="language-cpp">enum DATA_TYPE
{
    DATA_BOOL=0,
    DATA_FLOAT,
    DATA_UINT
};
</code></pre>
<p>Ich hätte jetzt gerne eine Funktion, die ein struct objekt und ein enum übergeben bekommt und mir den passenden Datenwert zurückgibt.<br />
Geht das?</p>
<p>Viele Grüße<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254955/methode-und-verschiedene-rückgabewerte</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 07:08:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254955.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Nov 2009 18:13:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 18:13:11 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende struct:</p>
<pre><code class="language-cpp">struct Data
{
    bool bData;
    float fData;
    uint nData;
};
</code></pre>
<p>und einen enum:</p>
<pre><code class="language-cpp">enum DATA_TYPE
{
    DATA_BOOL=0,
    DATA_FLOAT,
    DATA_UINT
};
</code></pre>
<p>Ich hätte jetzt gerne eine Funktion, die ein struct objekt und ein enum übergeben bekommt und mir den passenden Datenwert zurückgibt.<br />
Geht das?</p>
<p>Viele Grüße<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812507</guid><dc:creator><![CDATA[Franklo]]></dc:creator><pubDate>Mon, 23 Nov 2009 18:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 18:33:00 GMT]]></title><description><![CDATA[<p>Mach doch einfach 3 Funktionen.</p>
<pre><code class="language-cpp">float get_float ( Data const&amp; data );
bool get_boolean ( Data const&amp; data );
UINT get_uint ( Data const&amp; data );
</code></pre>
<p>Da kann man auch was mit templates machen, allerdings musst du dann innerhalb der Funktion die Auswahl des Typen machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812523</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 23 Nov 2009 18:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 18:48:07 GMT]]></title><description><![CDATA[<p>Hier eine etwas andere Herangehensweise, die je nachdem, was du vor hast, möglicherweise besser passen könnte:</p>
<pre><code class="language-cpp">struct Data
{
    bool bData;
    float fData;
    uint nData;
}; 	

enum DATA_TYPE
{
    DATA_BOOL=0,
    DATA_FLOAT,
    DATA_UINT
}; 

union return_Data{
    bool bData;
    float fData;
    uint nData;
};

return_Data foobar(Data input, DATA_TYPE chooser){
  return_Data value;
  switch (chooser){
  case DATA_BOOL: value.bData=input.bData; break;
  case DATA_FLOAT: value.fData=input.fData; break;
  case DATA_UINT: value.nData=input.nData; break;
  };
  return value;
}

int main()
{
  Data example={true,3.4, 7};
  cout&lt;&lt; foobar(example,DATA_BOOL).bData &lt;&lt;&quot; &quot;&lt;&lt; foobar(example,DATA_FLOAT).fData &lt;&lt; &quot; &quot;&lt;&lt; foobar(example,DATA_UINT).nData &lt;&lt; endl;

}
</code></pre>
<p>Ich würde aber Einzelfunktionen oder Templates bevorzugen, wie von drakon vorgeschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812538</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Nov 2009 18:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:01:50 GMT]]></title><description><![CDATA[<p>Hmmmm, danke.</p>
<p>Das passt aber irgendwie alles nicht so ganz.<br />
Eigentlich bräuchte ich eine einzige Funktion, die mir den richtigen konkreten Rückgabewert zurückgibt (also keine union, sonst muss ich ja nach Aufruf der Methode wissen, welcher Datentyp drin steht. Dann könnte ich auch gleich die struct auslesen.<br />
Zur Laufzeit habe ich ein enum und einen struct. Ich brauche jetzt eine Funktion, die mir in Abhängikeit von diesen Beiden variablen den korrekten Datentypen zurückgibt? Geht das überhaupt? Wie würde eine Template Lösung aussehen?</p>
<p>Vielen Dank euch Beiden!</p>
<p>Gruß<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812554</guid><dc:creator><![CDATA[Franklo]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:07:23 GMT]]></title><description><![CDATA[<p>Nein. Das geht so nicht.</p>
<p>Eine Funktion hat lediglich einen Rückgabetypen, welcher zur Kompilierungszeit feststeht. Und nun kannst du da nicht einen anderen Typen zurückgeben. (mal abgesehen von Polymorphie und unterschiedlichen Laufzeittypen, aber das ist wahrscheinlich auch nicht das, was du willst).</p>
<p>Auch die template Variante läuft darauf hinaus, dass du zur Kompilierungszeit angeben musst, welche Funktion du aufrufen willst. (ob das explizit oder implizit über einen Parameter geschieht kommt ja auch auf das selbe hinaus).</p>
<p>Um eine elegante Lösung zu finden, solltest du eher mal das Problem beschreiben, <strong>welches</strong> du lösen möchtest, anstatt <strong>wie</strong> du es lösen möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812557</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:30:38 GMT]]></title><description><![CDATA[<p>Ok, das macht Sinn...</p>
<blockquote>
<p>Um eine elegante Lösung zu finden, solltest du eher mal das Problem beschreiben, welches du lösen möchtest, anstatt wie du es lösen möchtest.</p>
</blockquote>
<p>Ich versuchs mal:<br />
Im Grunde hab ich 2 Klassen (A und B), die sich gegenseitig Daten schicken. Die Daten sind in einen Boost::Variant verpackt und können auf dem Weg zur anderen Klasse in einen anderen Datentypen umkonvertiert werden und/oder auf einen anderen Wert gemappt werden.<br />
(Ich hatte in meinem ersten Beispiel oben einen struct benutzt, da ich nicht weiß, ob ein Boost::Variant so geläufig ist und imo in meiner Implementierung dasselbe bezweckt).<br />
An den Beiden Enden (also in den Klassen selbst) gibt es eine receive Funktion, welche die Data in Form eines Boost::Variant und den zugehörigen Datentypen in Form eines enums bekommt.<br />
Jetzt suche ich ganz einach nach einer Möglichkeit, ohne switch cases zu arbeiten, weil mein Code zur Zeit daran &quot;erstickt&quot;. An allen Punkten, wo ich Konvertierungen/Mapping etc vornehme muss ich einen switch case einbauen um an den konkreten Wert zu kommen... vielleicht habe ich mit boost::variant auch nen Griff ins Klo gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Viele Grüße<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812578</guid><dc:creator><![CDATA[Franklo]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:45:22 GMT]]></title><description><![CDATA[<p>Hm. Hilft möglicherweise das Visitor-Pattern? Ich habe das mal* in Zusammenhang mit <em>Boost.Variant</em> gesehen, allerdings noch nie so verwendet. Ich denke, über Google und die Boost-Seite findest du dazu was.</p>
<p>_____<br />
<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="😉"
    /> Das war im Buch &quot;Beyond the C++ Standard Library: An Introduction to Boost&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812584</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:45:22 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:48:07 GMT]]></title><description><![CDATA[<p>Ja kenne ich, wird auch schon verwendet. Für das zu lösende Problem bringt es allerdings nichts, da man damit jeweils auch nur einen Datentypen zurückgeben kann.</p>
<p>Viele Grüße<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812586</guid><dc:creator><![CDATA[Franklo]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:49:24 GMT]]></title><description><![CDATA[<p>Es kann natürlich sein, dass ich hier was falsch verstehe, da ich noch nie mit boost:variant gearbeitet habe, aber:</p>
<p>Ist das tolle an boost Variant denn nicht gerade, dass das Objekt quasi weiß, was es ist? Also, dass du einfach für das Empfangen ein Visitor pattern benutzen könntest:</p>
<pre><code class="language-cpp">class receiver  : public boost::static_visitor&lt;&gt;
{
public:

    void operator()(bool &amp; b) const
    {
      // Was mit bool geschehen soll
    }

    void operator()(float &amp; f) const
    {
      // was mit float geschehen soll
    }

    void operator()(uint &amp; n) const
    {
      // was mit uint geschehen soll
    }

};

// ...

boost::apply_visitor( receiver(), empfangene_daten );
</code></pre>
<p>Also ganz ohne, dass man den Datentyp mitschickt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812588</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Methode und verschiedene Rückgabewerte on Mon, 23 Nov 2009 19:55:28 GMT]]></title><description><![CDATA[<p>Hi SeppJ,</p>
<p>das ist korrekt, allerdings müsste ich dann für jede Art der Konvertierung und Mappings eine eigene Visitor Klasse bauen. Komfortabel ist das auch nicht gerade...</p>
<p>Viele Grüße<br />
Franklo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812594</guid><dc:creator><![CDATA[Franklo]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:55:28 GMT</pubDate></item></channel></rss>