<?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[Funktion als Rückgabetyp]]></title><description><![CDATA[<p>Hey,</p>
<p>dass man Funktionen in C++ per Parameter übergeben kann, durfte ich vor einiger Zeit schon erstaunt feststellen. Aber kann man Funktionen auch zurückgeben?</p>
<p>Ich habe es so versucht, aber mein Compiler mag das nicht...</p>
<pre><code class="language-cpp">(double (*fkt)(double, double)) get_fkt(int);
</code></pre>
<p>LG Noob</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296814/funktion-als-rückgabetyp</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 18:42:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296814.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Dec 2011 21:40:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 21:40:56 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>dass man Funktionen in C++ per Parameter übergeben kann, durfte ich vor einiger Zeit schon erstaunt feststellen. Aber kann man Funktionen auch zurückgeben?</p>
<p>Ich habe es so versucht, aber mein Compiler mag das nicht...</p>
<pre><code class="language-cpp">(double (*fkt)(double, double)) get_fkt(int);
</code></pre>
<p>LG Noob</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156341</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Mon, 12 Dec 2011 21:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 21:47:02 GMT]]></title><description><![CDATA[<p>richtig so.</p>
<p>was du da verwendest ist nicht nur die benötigte definition deines rückgabewertes sondern auch ein name dabei</p>
<p>mach mal das hier draus:</p>
<pre><code class="language-cpp">(double (*)(double, double)) get_fkt(int);
</code></pre>
<p>oder noch besser</p>
<pre><code class="language-cpp">typedef (double (fkt*)(double, double));

fkt getFkt(int);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2156344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156344</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 12 Dec 2011 21:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 21:53:19 GMT]]></title><description><![CDATA[<p>Geht leider auch nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Die selbe Fehlermeldung:</p>
<blockquote>
<p>error C2062: 'double'-Typ unerwartet</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2156347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156347</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Mon, 12 Dec 2011 21:53:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 21:55:40 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>oder noch besser</p>
<pre><code class="language-cpp">typedef (double (fkt*)(double, double));

fkt getFkt(int);
</code></pre>
</blockquote>
<p>Eher</p>
<pre><code class="language-cpp">typedef double (*fkt)(double, double);

fkt getFkt(int);
</code></pre>
<p>Wie es ohne Typedef geht... weiss ich nicht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2156350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156350</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 12 Dec 2011 21:55:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 21:55:55 GMT]]></title><description><![CDATA[<p>Der Stern ist auch auf der falschen Seite. Und auch die Klammern werden von VS nicht geschluckt.<br />
So funktioniert's:<br />
<code>typedef double (*fkt)(double, double);</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156351</guid><dc:creator><![CDATA[comonad]]></dc:creator><pubDate>Mon, 12 Dec 2011 21:55:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 21:57:04 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>richtig so.</p>
<p>was du da verwendest ist nicht nur die benötigte definition deines rückgabewertes sondern auch ein name dabei</p>
<p>mach mal das hier draus:</p>
<pre><code class="language-cpp">(double (*)(double, double)) get_fkt(int);
</code></pre>
</blockquote>
<p>Sollte auch nicht gehen. Richtig ist:</p>
<pre><code class="language-cpp">double (*get_fkt(int))(double, double)
</code></pre>
<p>Nimm lieber einen Typedef <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/2156352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156352</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 12 Dec 2011 21:57:04 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 22:16:55 GMT]]></title><description><![CDATA[<p>Ja super, es funktioniert! <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>Eines der Mysterien, auf denen die meisten Tutorials keine Antwort haben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Danke! <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="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156357</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Mon, 12 Dec 2011 22:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 22:45:07 GMT]]></title><description><![CDATA[<p>Eine Funktion als Rückgabewert ist schon ziemlich abgefahren... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Fällt jmd. zufällig auch ein Beispiel ein an wo so etas Sinn macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156365</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 12 Dec 2011 22:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 22:49:32 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Fällt jmd. zufällig auch ein Beispiel ein an wo so etas Sinn macht?</p>
</blockquote>
<p>Naja, für GetProcAddress() und ähnliche Funktionen wäre es praktisch.</p>
<p>Wobei GetProcAddress() lieber nen void* zurückgibt, bei dem das Casten in einen Funktionszeiger laut Standard nicht definiert ist (UB oder implementation defined - weiss ich jetzt nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156367</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 12 Dec 2011 22:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 23:07:39 GMT]]></title><description><![CDATA[<p>ok, passt nicht ganz, aber hat jemand irgendwo nen gutes tut für solche funktionsspielchen?<br />
habe auch schon davon gehört, und das wäre natürlich mega, wenn ich es selbst anwenden könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
also ein tutorial hauptsächlich darüber, wie ich ne funktion übergebe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156369</guid><dc:creator><![CDATA[DNKpp]]></dc:creator><pubDate>Mon, 12 Dec 2011 23:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Mon, 12 Dec 2011 23:43:47 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Eine Funktion als Rückgabewert ist schon ziemlich abgefahren... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Fällt jmd. zufällig auch ein Beispiel ein an wo so etas Sinn macht?</p>
</blockquote>
<p>Die C-Standardfunktion signal.</p>
<p>anti-freak schrieb:</p>
<blockquote>
<p>gutes tut</p>
</blockquote>
<p>Widerspruch in sich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156374</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 12 Dec 2011 23:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 00:31:56 GMT]]></title><description><![CDATA[<p>Auto, tut-tut!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156379</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 13 Dec 2011 00:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 01:03:19 GMT]]></title><description><![CDATA[<p>ichbineinnoob schrieb:</p>
<blockquote>
<p>Hey,</p>
<p>dass man Funktionen in C++ per Parameter übergeben kann, durfte ich vor einiger Zeit schon erstaunt feststellen. Aber kann man Funktionen auch zurückgeben?</p>
<p>Ich habe es so versucht, aber mein Compiler mag das nicht...</p>
<pre><code class="language-cpp">(double (*fkt)(double, double)) get_fkt(int);
</code></pre>
<p>LG Noob</p>
</blockquote>
<p>Eigentlich nicht Funktionen, sondern Zeiger oder Referenzen darauf. Interessanterweise macht der Compiler von sich aus Zeiger daraus, wenn man Funktion schreibt. Aber nur bei Parametern. Beim Rückgabetyp ist es schlicht nicht erlaubt.</p>
<pre><code class="language-cpp">typedef double fkt(double,double);
void do(fkt f); // äquivalent zu
void do(fkt* f); // oder ausgeschrieben
void do(double f(double,double)); // bzw.
void do(double (*f)(double,double)); // wer will auch
void do(fkt&amp; f); // das kann aber nur mit Funktionen gefüttert werden,
void do(double (&amp;f)(double,double)); // Zeiger muss man erst explizit dereferenzieren, also nicht wirklich sinnvoll

// aber
fkt get_fkt(int); // Fehler!
fkt* get_fkt(int); // oder auch
fkt&amp; get_fkt(int); // allerdings ohne semantische Vorteile
//ausgeschrieben
double (*get_fkt(int))(double,double); // oder
double (&amp;get_fkt(int))(double,double);
</code></pre>
<p>Danke, K&amp;R. Trotz dieser *hust* Eleganz ist es nicht möglich, Eine Funktion zu deklarieren, die einen Zeiger auf sich selbst zurückgibt (mit dem richtigen Typ).<br />
ach ja, dann geht auch noch C++11:</p>
<pre><code class="language-cpp">auto get_fkt(int) -&gt; fkt*;
auto get_fkt(int) -&gt; double (*)(double,double); // usw.
</code></pre>
<p>etwas besser lesbar, erlaubt aber auch nicht mehr als die alte Syntax.</p>
<pre><code class="language-cpp">auto get_fkt(int a) -&gt; decltype(&amp;get_fkt);
</code></pre>
<p>wäre schön, geht aber nicht, weil Namen erst am Ende aller Deklaratoren bekannt sind, im decltype ist der Funktionsname noch unbekannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156380</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 13 Dec 2011 01:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 11:33:31 GMT]]></title><description><![CDATA[<p>anti-freak schrieb:</p>
<blockquote>
<p>ok, passt nicht ganz, aber hat jemand irgendwo nen gutes tut für solche funktionsspielchen?<br />
habe auch schon davon gehört, und das wäre natürlich mega, wenn ich es selbst anwenden könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
also ein tutorial hauptsächlich darüber, wie ich ne funktion übergebe.</p>
</blockquote>
<p>Das ist ein Einzeiler:<br />
Funktionen können weder als Parameter an eine Funktion übergeben werden, noch zurückgeliefert werden, da es den Datentyp function oder wie auch immer das genannt werden soll, nicht gibt. Lambdafunktionen des neuesten C++ Standards mögen etwas ähnliches sein, dazu kann ich aber nix sagen, da ich zu wenig darüber weiß.</p>
<p>Na gut, waren jetzt doch mehr als eine Zeile.</p>
<p>Als Ersatz können <strong>Zeiger</strong> auf Funktionen definiert werden. Das geht sehr einfach:</p>
<p>1. Schritt: erstelle einen Prototypen:</p>
<p>&lt;type&gt; &lt;functionName&gt;( &lt;type&gt; &lt;param&gt;, ... );<br />
Beispiel:</p>
<pre><code class="language-cpp">int compare( const char *s1, const char *s2);
</code></pre>
<p>2. Schritt: füge Klammern um den Funktionsnamen ein:<br />
&lt;type&gt; (&lt;functionName&gt;) ( &lt;type&gt; &lt;param&gt;, ... );<br />
Beispiel:</p>
<pre><code class="language-cpp">int (compare)( const char *s1, const char *s2);
</code></pre>
<p>3. Schritt: setze den Zeigeroperator vor dem Funktionsnamen:<br />
&lt;type&gt; (*&lt;functionName&gt;) ( &lt;type&gt; &lt;param&gt;, ... );<br />
Beispiel:</p>
<pre><code class="language-cpp">int (*compare)( const char *s1, const char *s2);
</code></pre>
<p>4. Schritt: gibt dem Zeiger 'nen anständigen Namen:<br />
&lt;type&gt; (*&lt;pointerName&gt;) ( &lt;type&gt; &lt;param&gt;, ... );<br />
Beispiel:</p>
<pre><code class="language-cpp">int (*comparePtr)( const char *s1, const char *s2);
</code></pre>
<p>Zum Befüllen des Zeigers schreibst Du einfach die Adresse einer Funktion mit dem passenden Prototypen rein. Die Adresse erhälst Du, in dem Du den Funktionsnamen ohne Parameterliste schreibst.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">comparePtr = compare;
</code></pre>
<p>Zum Derefenezieren des Funktionszeigers schreibst Du den Namen des Zeigers mit Parameterliste:</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">int result = comparePtr( &quot;Hello&quot;, &quot;World&quot; );
</code></pre>
<p>Wenn Du mehr als einen Zeiger auf so eine Funktion brauchst, ist es sinnvoll sich mit typedef einen Typ zu definieren:</p>
<pre><code class="language-cpp">typedef int (*comparePtrType)( const char *s1, const char *s2);
...
comparePtrType comparePtr = compare;
</code></pre>
<p>Das sollte es sein.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156452</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 13 Dec 2011 11:33:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 11:46:02 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Funktionen können weder als Parameter an eine Funktion übergeben werden, noch zurückgeliefert werden, da es den Datentyp function oder wie auch immer das genannt werden soll, nicht gibt.</p>
</blockquote>
<p>Da du den neuen Standard erwähnt hast, was ist mit std::function?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156459</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 13 Dec 2011 11:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 11:48:25 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Funktionen können weder als Parameter an eine Funktion übergeben werden, noch zurückgeliefert werden, da es den Datentyp function oder wie auch immer das genannt werden soll, nicht gibt.</p>
</blockquote>
<p>Das ist auf subtile Weise richtig. Es gibt Funktionstypen, aber Funktionstypen sind keine Objekttypen (oder Datentypen wenn du sie so nennen willst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156461</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 13 Dec 2011 11:48:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 12:51:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Fällt jmd. zufällig auch ein Beispiel ein an wo so etas Sinn macht?</p>
</blockquote>
<p>Unter reinem c++ wohl eher seltener, weil es fuer c++ bessere Mittel gibt (Interfaces / virtualitaet).<br />
bleibt C und C kompatiblitaet mit c++ ....</p>
<p>bei C wird man aber wohl eher keinen funktionspointer als rueckgabewert waehlen, sondern eher den Fehlercode, der eigentliche rueckgabewert ist dann in den paramatern als zeiger auf ... modeliert.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156493</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 13 Dec 2011 12:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 13:42:38 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/std/new/set_new_handler/" rel="nofollow">set_new_handler</a> Ist z.B. eine Funktion aus dem C++-Standard, die einen Funktionspointer zurückgibt. Gibt afaik noch ein paar andere...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156525</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 13 Dec 2011 13:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 13:45:46 GMT]]></title><description><![CDATA[<p>set_unexpected und set_terminate fallen mir da ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156528</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 13 Dec 2011 13:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 13:46:20 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Eine Funktion als Rückgabewert ist schon ziemlich abgefahren... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Fällt jmd. zufällig auch ein Beispiel ein an wo so etas Sinn macht?</p>
</blockquote>
<p>Mal so ein Vorschlag:</p>
<p>qsort erwartet als einen der Parameter die Adresse einer Vergleichsfunktion. Dummerweise wird weder der Vergleichsfunktion noch qsort das Sortierkriterium mitgegeben. Daher wäre folgenden Szenario denkbar:</p>
<pre><code class="language-cpp">typedef int (*comparePtrType)( const void *e1, const void *e2 );

int compareNames( const void *e1, const void *e2 );
int compareSizes( const void *e1, const void *e2 );
int compareAges( const void *e1, const void *e2 );

comparePtrType getCompareFunc( int criteria )
{
   switch( criteria )
   {
      case 0:
         return compareNames;
      case 1:
         return compareSizes;
      case 2:
         return compareAges;
   }

   return NULL;
}

void sortData( void *data, size_t numElements, size_t dataSize, int criteria )
{
   comparePtrType compareFunc = getCompareFunc( criteria );
   if( compareFunc )
      qsort( data, numElements, dataSize, comparefunc );
}
</code></pre>
<p>Hab's jetzt nicht übersetzt sondern nur so hingeschrieben. Tippfehler müsst Ihr daher selbst beheben.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156529</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 13 Dec 2011 13:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 13:49:40 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>qsort erwartet als einen der Parameter die Adresse einer Vergleichsfunktion. [...]</p>
<pre><code class="language-cpp">/* viel C-Code... */
</code></pre>
</blockquote>
<p>Macht man in C++ komplett anders. Templates statt void-Pointern, und das Vergleichskriterium hängt man dann auch eher in einen Functor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156531</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 13 Dec 2011 13:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 13:52:26 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>qsort erwartet als einen der Parameter die Adresse einer Vergleichsfunktion. [...]</p>
<pre><code class="language-cpp">/* viel C-Code... */
</code></pre>
</blockquote>
<p>Macht man in C++ komplett anders. Templates statt void-Pointern, und das Vergleichskriterium hängt man dann auch eher in einen Functor.</p>
</blockquote>
<p>Klar, nur wollte jemand ein einigermassen sinnvolles Bespiel. Mir ist halt auf die schnelle nix beseres eingefallen.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156534</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 13 Dec 2011 13:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 13:52:58 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Zum Derefenezieren des Funktionszeigers schreibst Du den Namen des Zeigers mit Parameterliste:</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">int result = comparePtr( &quot;Hello&quot;, &quot;World&quot; );
</code></pre>
</blockquote>
<p>Nö. Funktionszeiger funktionieren genau wie normale Zeiger auch, bloß sind sie umständlich zu deklarieren.</p>
<pre><code class="language-cpp">typedef vector&lt;string&gt; Function(int, double);
Function*  func_ptr    = some_func; // einzig hier ist der Adressoperator optional
Function&amp;  func_ref    = *func_ptr;
Function&amp;&amp; func_refref = std::move(func_ref); // klingt unlogisch, ist es auch
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2156535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156535</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 13 Dec 2011 13:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 14:12:39 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Function&amp;&amp; func_refref = std::move(func_ref); // klingt unlogisch, ist es auch
</code></pre>
</blockquote>
<p>Auf die Schnelle kann nicht finden, dass das verboten ist, scheint aber ein Defekt zu sein. Denn dieses func_refref kann weder dazu benutzt werden, einen Zeiger auf eine Funktion zu bilden, noch die Funktion selbst aufzurufen (beides setzt ein Funktions-lvalue voraus).<br />
Entweder müssen die entsprechenden Abschnitte in 4.3 und 5.2.2 geändert werden, oder dieses Konstrukt wird verboten oder als lvalue-Referenz intepretiert.<br />
Evtl. steht aber schon irgendwo etwas dazu.</p>
<p>Funktion-rvalues entstehen traditionell nur in der Form gebundener Memberfunktionen, in</p>
<pre><code class="language-cpp">struct { void foo(); } bar;
bar.foo();
</code></pre>
<p>ist</p>
<pre><code class="language-cpp">bar.foo
</code></pre>
<p>ein Funktions-rvalue (in C++03).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156541</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 13 Dec 2011 14:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 14:07:44 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Klar, nur wollte jemand ein einigermassen sinnvolles Bespiel.</p>
</blockquote>
<p>Eben - in C++ ist dein Beispiel nicht sinnvoll <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/2156542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156542</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 13 Dec 2011 14:07:44 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Rückgabetyp on Tue, 13 Dec 2011 14:12:13 GMT]]></title><description><![CDATA[<p>btw. ich muss hier mal einen Vorposter korrigieren:</p>
<p>GetProcAddress gibt einen Funktionszeiger zurück, nämlich &quot;void (*)(void)&quot;<br />
oder wie Microsoft es per typedef nennt &quot;FARPROC&quot;.</p>
<p>Lediglich dlsym weist den Defekt auf, einen void* zurückzugeben.</p>
<p>Btw. bevorzugte Nutzung von Funktionszeigern sind Callbacks.<br />
Das trifft aber hauptsächlich im Zusammenhang mit C-Bibliotheken auf,<br />
da man in C++ eben eher auf Templates und Funktoren setzt.<br />
Ausnahme stellen hier DLL's dar, da man Templates nicht ohne größere Probleme exportieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156545</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Tue, 13 Dec 2011 14:12:13 GMT</pubDate></item></channel></rss>