<?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[Funktor statt Funktionszeiger]]></title><description><![CDATA[<p>Ich habe eine Frage, die so erstmal nichts mit Standard-C++ zu tun hat:</p>
<p>Ich möchte ein Programm in FLTK schreiben. Dabei kann ich den einzelnen Objekten Callback-Funktionen zuweisen, indem ich mir erst die Callback-Funktion definiere, z.B.:</p>
<pre><code class="language-cpp">void xyz_callback(Fl_Widget *w, void *data)
{
...
}
</code></pre>
<p>und dann diese Funktion bei dem jeweiligen Objekt registriere, mit</p>
<pre><code class="language-cpp">int xyz_data;
button-&gt;callback(xyz_callback, data);
</code></pre>
<p>Jetzt stelle ich mir die Frage, was man machen muss, wenn man nicht eine einfache Funktion, sondern einen Funktor (Funktionsobjekt) als Callback-Funktion verwenden möchte.</p>
<p>Könnte man die FLTK-Klasse (in diesem Fall z.B.) Button so kapseln, dass man im Endeffekt dem FLTK-Objekt eine Funktion als Callback-Funktion übergibt, die ihrerseits dann den Funktor aufruft?</p>
<p>Ich komme irgendwie nicht weiter.</p>
<p>Als Template-Parameter kann man den Funktor ja auch nicht einfach übergeben, also so etwas wie:</p>
<pre><code class="language-cpp">class Funktor
{
public:
    void operator()(Fl_Widget *w, void *data);
};

template&lt;Funktor F&gt;
void callback_funktion(Fl_Widget *w, void *data)
{
    F(w,data);
}
</code></pre>
<p>Bei Templates müssen die Parameter ja statisch sein, d.h. ein Aufruf wie</p>
<pre><code class="language-cpp">Funktor meinFunktor;
button-&gt;callback(&amp;(callback_funktion&lt;meinFunktor&gt;), data);
</code></pre>
<p>würde nicht funktionieren...</p>
<p>Hat irgendwer eine Idee?</p>
<p>Felix :xmas2:</p>
<p>P.S.: Ich hoffe, der Thread passt trotzdem her hin, die Lösung zu dem Problem sollte ja reines Standard-C++ sein. Ich möchte ja eigentlich nur einen Funktor an einer Stelle benutzen können, an der normalerweise ein Funktionszeiger erwartet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167753/funktor-statt-funktionszeiger</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 02:23:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167753.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Dec 2006 16:05:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktor statt Funktionszeiger on Thu, 14 Dec 2006 16:05:16 GMT]]></title><description><![CDATA[<p>Ich habe eine Frage, die so erstmal nichts mit Standard-C++ zu tun hat:</p>
<p>Ich möchte ein Programm in FLTK schreiben. Dabei kann ich den einzelnen Objekten Callback-Funktionen zuweisen, indem ich mir erst die Callback-Funktion definiere, z.B.:</p>
<pre><code class="language-cpp">void xyz_callback(Fl_Widget *w, void *data)
{
...
}
</code></pre>
<p>und dann diese Funktion bei dem jeweiligen Objekt registriere, mit</p>
<pre><code class="language-cpp">int xyz_data;
button-&gt;callback(xyz_callback, data);
</code></pre>
<p>Jetzt stelle ich mir die Frage, was man machen muss, wenn man nicht eine einfache Funktion, sondern einen Funktor (Funktionsobjekt) als Callback-Funktion verwenden möchte.</p>
<p>Könnte man die FLTK-Klasse (in diesem Fall z.B.) Button so kapseln, dass man im Endeffekt dem FLTK-Objekt eine Funktion als Callback-Funktion übergibt, die ihrerseits dann den Funktor aufruft?</p>
<p>Ich komme irgendwie nicht weiter.</p>
<p>Als Template-Parameter kann man den Funktor ja auch nicht einfach übergeben, also so etwas wie:</p>
<pre><code class="language-cpp">class Funktor
{
public:
    void operator()(Fl_Widget *w, void *data);
};

template&lt;Funktor F&gt;
void callback_funktion(Fl_Widget *w, void *data)
{
    F(w,data);
}
</code></pre>
<p>Bei Templates müssen die Parameter ja statisch sein, d.h. ein Aufruf wie</p>
<pre><code class="language-cpp">Funktor meinFunktor;
button-&gt;callback(&amp;(callback_funktion&lt;meinFunktor&gt;), data);
</code></pre>
<p>würde nicht funktionieren...</p>
<p>Hat irgendwer eine Idee?</p>
<p>Felix :xmas2:</p>
<p>P.S.: Ich hoffe, der Thread passt trotzdem her hin, die Lösung zu dem Problem sollte ja reines Standard-C++ sein. Ich möchte ja eigentlich nur einen Funktor an einer Stelle benutzen können, an der normalerweise ein Funktionszeiger erwartet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191879</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Thu, 14 Dec 2006 16:05:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor statt Funktionszeiger on Thu, 14 Dec 2006 22:27:15 GMT]]></title><description><![CDATA[<p>Wieso nicht?</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;

typedef void (*FunctionPtr)(void* userData);

void SomeStupidFunction(FunctionPtr fp, void* userData)
{
	fp(userData);
}

class MyFunctor
{
public:
	void operator () ()
	{
		printf(&quot;Winke-winke!\n&quot;);
	}
};

template&lt;class T&gt; void WrapFunctor(void* functor)
{
	(*static_cast&lt;T*&gt;(functor))();
}

int main(int argc, char** argv)
{
	MyFunctor f;
	SomeStupidFunction(WrapFunctor&lt;MyFunctor&gt;, &amp;f);
	_getch();

	return 0;
}
</code></pre>
<p>p.S.: parameter kannst du dann z.B. mit boost::bind dranbinden (an den Funktor) - das selbst zu implementieren wäre mir entschieden zuviel Aufwand. Musst du dann halt in ein boost::function&lt;void()&gt; reinstecken, und das boost::function&lt;void()&gt; ist dann der Funktor den du an &quot;WrapFunctor&quot; übergibst.</p>
<p>p.p.S.: oder du schreibst einfach bloss Funktoren die keine Parameter brauchen, frei nach dem &quot;accumulate and fire&quot; Pattern, bloss halt nicht über globale Variablen, sondern über Member -- dann ist das auch nicht so unsauber. boost::bind macht auch nix anderes, bloss halt automatisiert, dafür muss der Funktor rumkopiert werden (was aber egal sein sollte -- ein Funktor mit viel State ist eh böse).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192105</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 14 Dec 2006 22:27:15 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor statt Funktionszeiger on Fri, 15 Dec 2006 02:30:25 GMT]]></title><description><![CDATA[<p>Cool...</p>
<p>Hast du das Beispiel selbst geschrieben oder wo hast du das her?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192151</guid><dc:creator><![CDATA[*Cpp-Anfänger* 0]]></dc:creator><pubDate>Fri, 15 Dec 2006 02:30:25 GMT</pubDate></item></channel></rss>