<?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[Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht.]]></title><description><![CDATA[<p>Servus,</p>
<p>an diesem Gedankenspiel sind zwei Partner beteiligt: Die Klasse Client, die eine Callbackfunktion hat, die aufgerufen werden soll, wenn verschiedene asynchrone Anfragen ausgeführt wurden, und die Klasse Manager, die eben diese Anfragen abarbeitet.</p>
<p>Jetzt gibt es einen Manager und viele Clients.<br />
Die Idee ist, dass sich Clients im Konstruktor bei Manager anmelden, und der eine Liste von Funktionspointern abspeichert. Bei Fertigstellung einer Aufgabe sollen diese Funktionspointer abgeklappert werden.</p>
<p>Soviel habe ich bis jetzt:</p>
<pre><code class="language-cpp">class Client {
public:
  Client(Manager&amp; manager);
  void doStuff() { /*whatever*/ }
}

Client::Client(Manager&amp; manager)
{
  manager.registerCallback(std::bind1st(
      std::mem_fun(&amp;Client::doStuff), this));
}

class Manager {
public:
  void registerCallback(boost::function&lt;void(void)&gt; fun);
  void process();
private:
  std::list&lt;boost::function&lt;void(void)&gt; &gt; m_callbacks;
}

void Manager::registerCallback(boost::function&lt;void(void)&gt; fun)
{
  m_callbacks.push_back(fun);
}
void Manager::process()
{
  for_each(m_callbacks.begin(), m_callbacks.end(), /* und was nun? */);
}
</code></pre>
<p>Prinzip sollte klar sein: Memberfunktion wird gebunden und dem Manger übergeben, der Sie in die Liste pusht.<br />
Wie kann der Manager jetzt die Liste abarbeiten? Wie invoke ich denn den Funktionspointer über seinen Iterator? *verwirrt*</p>
<p>EDIT: Nochwas: Geht das auch mit &quot;echten&quot; Funktionspointern, also ohne boost? Irgendwie steh ich mit den echten auf Kriegsfuß, weil die sich nie so binden lassen wie ich will.</p>
<p>Danke für gute Ideen,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260348/liste-von-callback-funktionspointern-abarbeiten-elegante-lösung-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 04:29:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260348.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Feb 2010 00:34:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht. on Thu, 04 Feb 2010 00:37:15 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>an diesem Gedankenspiel sind zwei Partner beteiligt: Die Klasse Client, die eine Callbackfunktion hat, die aufgerufen werden soll, wenn verschiedene asynchrone Anfragen ausgeführt wurden, und die Klasse Manager, die eben diese Anfragen abarbeitet.</p>
<p>Jetzt gibt es einen Manager und viele Clients.<br />
Die Idee ist, dass sich Clients im Konstruktor bei Manager anmelden, und der eine Liste von Funktionspointern abspeichert. Bei Fertigstellung einer Aufgabe sollen diese Funktionspointer abgeklappert werden.</p>
<p>Soviel habe ich bis jetzt:</p>
<pre><code class="language-cpp">class Client {
public:
  Client(Manager&amp; manager);
  void doStuff() { /*whatever*/ }
}

Client::Client(Manager&amp; manager)
{
  manager.registerCallback(std::bind1st(
      std::mem_fun(&amp;Client::doStuff), this));
}

class Manager {
public:
  void registerCallback(boost::function&lt;void(void)&gt; fun);
  void process();
private:
  std::list&lt;boost::function&lt;void(void)&gt; &gt; m_callbacks;
}

void Manager::registerCallback(boost::function&lt;void(void)&gt; fun)
{
  m_callbacks.push_back(fun);
}
void Manager::process()
{
  for_each(m_callbacks.begin(), m_callbacks.end(), /* und was nun? */);
}
</code></pre>
<p>Prinzip sollte klar sein: Memberfunktion wird gebunden und dem Manger übergeben, der Sie in die Liste pusht.<br />
Wie kann der Manager jetzt die Liste abarbeiten? Wie invoke ich denn den Funktionspointer über seinen Iterator? *verwirrt*</p>
<p>EDIT: Nochwas: Geht das auch mit &quot;echten&quot; Funktionspointern, also ohne boost? Irgendwie steh ich mit den echten auf Kriegsfuß, weil die sich nie so binden lassen wie ich will.</p>
<p>Danke für gute Ideen,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850189</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Thu, 04 Feb 2010 00:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht. on Thu, 04 Feb 2010 00:57:46 GMT]]></title><description><![CDATA[<p>Der Algorithmus <code>std::for_each()</code> kommt mir hier nicht sehr geeignet vor. Wie wärs mit einer normalen Iterationsschleife?</p>
<pre><code class="language-cpp">void Manager::process()
{
  // callback_list ist ein typedef
  for (callback_list::iterator itr = m_callbacks.begin(), end = m_callbacks.end(); itr != end; ++itr)
    (*itr)();
}
</code></pre>
<p>Oder sonst eben eine Extrafunktion:</p>
<pre><code class="language-cpp">void call(boost::function&lt;void(void)&gt;&amp; fn)
{
	fn();
}

void Manager::process()
{
  std::for_each(m_callbacks.begin(), m_callbacks.end(), &amp;call);
}
</code></pre>
<p>Native Memberfunktionszeiger würden schon auch funktionieren, wären allerdings sehr eingeschränkt. Binden wäre damit nicht möglich. Für die Syntax kannst du dir <a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a> anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850191</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 04 Feb 2010 00:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht. on Thu, 04 Feb 2010 01:31:25 GMT]]></title><description><![CDATA[<p>Super. Funzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850198</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Thu, 04 Feb 2010 01:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht. on Thu, 04 Feb 2010 05:08:17 GMT]]></title><description><![CDATA[<p>Übrigens, genau das, was du hier implementierst, bietet boost.Signals.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850204</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 04 Feb 2010 05:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht. on Thu, 04 Feb 2010 12:17:32 GMT]]></title><description><![CDATA[<p>Stimmt. Die Entwickler von Boost.Signals haben zum Beispiel auch einen Weg gefunden, gespeicherte Funktionen wieder zu löschen. Eine Löschung ist aufgrund der fehlenden Möglichkeit, <code>boost::function</code> zu vergleichen, nämlich nicht ganz trivial.</p>
<p>Dazu habe ich vor einiger Zeit übrigens einen <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-255945.html" rel="nofollow">Thread</a> erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850357</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 04 Feb 2010 12:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to Liste von Callback-Funktionspointern abarbeiten - elegante Lösung gesucht. on Thu, 04 Feb 2010 12:22:49 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Funzt.</p>
</blockquote>
<p>HMMMM<br />
<a href="http://www.wie-sagt-man-noch.de/synonyme/funzen.html" rel="nofollow">http://www.wie-sagt-man-noch.de/synonyme/funzen.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850361</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 04 Feb 2010 12:22:49 GMT</pubDate></item></channel></rss>