<?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[Von Method Pointern, Templates und Callback Funktionen]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich schreibe mir zur Zeit ein kleines Eventsystem, das über Callback Methoden läuft. Um die wiederverwendbarkeit zu eröhen habe ich mich dazu entschlossen das ganze über ein Template zu definieren.</p>
<p>Folgenden Code habe ich &quot;fabriziert&quot;:</p>
<pre><code class="language-cpp">template &lt;class _ReceiverClass, typename _CallbackType&gt;
class CCallback
{
private:
	_ReceiverClass* m_pReceiver;
	_CallbackType m_pCallback;
public:
	CCallback(_ReceiverClass* receiver, _Callbacktype callback);
	~CCallback(void);
};
</code></pre>
<p>Soweit so gut. Mein nächster Schritt wäre es gewesen eine call-Methode zu implementieren, jedoch stoße ich damit an meine Template Know-How Grenzen. Um eine call Methode zu implementieren müsste ich den Rückgabewert und die Parameterliste von _CallbackType kennen. Diese lassen sich dort jedoch nichtmehr &quot;extrahieren&quot;, oder doch?<br />
Ich gehe davon aus, dass dies nicht möglich ist. Es wäre also notwendig dem Template nicht den typen _CallbackType zu geben, sondern die Typen des Rückgabewertes und der Parameterliste. Ist, und wenn ja, wie, es möglich einem Template eine &quot;Parameterliste&quot; zu übergeben?</p>
<p>Pseudocode:</p>
<pre><code class="language-cpp">template &lt;class _ReceiverClass, typename _CallbackReturnType, paramlist _CallbackParams&gt;
class CCallback
{
private:
	_ReceiverClass* m_pReceiver;
	_CallbackReturnType _ReceiverClass::*(_CallbackParams) m_pCallback;
public:
	CCallback(_ReceiverClass* receiver, _Callbacktype callback);
	_CallbackReturnType call(_CallbackParams);
	~CCallback(void);
</code></pre>
<p>Ich befürchte, dass dies nicht möglich ist. Als alternative schwebt mir zur Zeit vor die Callback Funktion einfach auf einen Parameter zu fixieren. Wenn mehr Parameter benötigt werden kann vom Programmierer ja ein komplexer Parameter, wie ein Pointer auf eine Struktur oder ein Objekt gewählt werden.</p>
<p>Gibt es da vielleicht irgendwelche Ideen oder Vorschläge, wie ich das ganze alternativ implementieren könnte?</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227630/von-method-pointern-templates-und-callback-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 21:16:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227630.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Nov 2008 07:59:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 08:00:25 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich schreibe mir zur Zeit ein kleines Eventsystem, das über Callback Methoden läuft. Um die wiederverwendbarkeit zu eröhen habe ich mich dazu entschlossen das ganze über ein Template zu definieren.</p>
<p>Folgenden Code habe ich &quot;fabriziert&quot;:</p>
<pre><code class="language-cpp">template &lt;class _ReceiverClass, typename _CallbackType&gt;
class CCallback
{
private:
	_ReceiverClass* m_pReceiver;
	_CallbackType m_pCallback;
public:
	CCallback(_ReceiverClass* receiver, _Callbacktype callback);
	~CCallback(void);
};
</code></pre>
<p>Soweit so gut. Mein nächster Schritt wäre es gewesen eine call-Methode zu implementieren, jedoch stoße ich damit an meine Template Know-How Grenzen. Um eine call Methode zu implementieren müsste ich den Rückgabewert und die Parameterliste von _CallbackType kennen. Diese lassen sich dort jedoch nichtmehr &quot;extrahieren&quot;, oder doch?<br />
Ich gehe davon aus, dass dies nicht möglich ist. Es wäre also notwendig dem Template nicht den typen _CallbackType zu geben, sondern die Typen des Rückgabewertes und der Parameterliste. Ist, und wenn ja, wie, es möglich einem Template eine &quot;Parameterliste&quot; zu übergeben?</p>
<p>Pseudocode:</p>
<pre><code class="language-cpp">template &lt;class _ReceiverClass, typename _CallbackReturnType, paramlist _CallbackParams&gt;
class CCallback
{
private:
	_ReceiverClass* m_pReceiver;
	_CallbackReturnType _ReceiverClass::*(_CallbackParams) m_pCallback;
public:
	CCallback(_ReceiverClass* receiver, _Callbacktype callback);
	_CallbackReturnType call(_CallbackParams);
	~CCallback(void);
</code></pre>
<p>Ich befürchte, dass dies nicht möglich ist. Als alternative schwebt mir zur Zeit vor die Callback Funktion einfach auf einen Parameter zu fixieren. Wenn mehr Parameter benötigt werden kann vom Programmierer ja ein komplexer Parameter, wie ein Pointer auf eine Struktur oder ein Objekt gewählt werden.</p>
<p>Gibt es da vielleicht irgendwelche Ideen oder Vorschläge, wie ich das ganze alternativ implementieren könnte?</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616271</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Tue, 18 Nov 2008 08:00:25 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 08:34:52 GMT]]></title><description><![CDATA[<p>Nein, ist leider im Moment nicht möglich. Wird dann aber mit C++0x möglich sein. Nennt sich variadic templates. Ich würde es somit auch auf 2 Parameter beschränken. Mehr ist normalerweise auch gar nicht nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616291</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 18 Nov 2008 08:34:52 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 09:10:38 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort. Ich habe mal zu implementieren begonnen und bin auf folgende recht eigenartige Fehlermeldung gestoßen, zu welcher ich auch keine Lösung finde.</p>
<blockquote>
<p>error C2659: &quot;=&quot;: Funktion als linker Operand.</p>
</blockquote>
<p>(MSVC++ 2008)</p>
<p>Hier die relevanten Code Abschnitte:</p>
<pre><code class="language-cpp">template &lt;class _ReceiverClass, typename _CallbackReturnType, typename _CallbackParamType&gt;
class CCallback
{
public:
	typedef _CallbackReturnType _ReceiverClass::*CallbackType(_CallbackParamType);

// ... 

	CallbackType m_pCallback;

// ... 

inline CCallback(_ReceiverClass* receiver, CallbackType callback) : m_pReceiver(receiver)
	{
		m_pCallback = callback;
	}
</code></pre>
<p>Ich verstehe nicht weshalb dieser Fehler auftritt und wie ich ihn besieitgen kann. Ich nehme an, dass er in Zusammenhang mit den Templates steht, aber ich bin mir nicht sicher, denn *eigentlich* sollte die Zuweisung ok sein.</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616314</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Tue, 18 Nov 2008 09:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 10:09:01 GMT]]></title><description><![CDATA[<p>Habe die Lösung zu meinem Problem finden können, ich habe bei der Definition des Method Pointer Typs einen kleinen Fehler gemacht und zwei Klammern vergessen:</p>
<pre><code class="language-cpp">public:
    typedef _CallbackReturnType (_ReceiverClass::*CallbackType)(_CallbackParamType);
</code></pre>
<p>So klappt es.</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616336</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Tue, 18 Nov 2008 10:09:01 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 10:27:28 GMT]]></title><description><![CDATA[<p>Es hat sich bezüglich meiner Callback Implementation eine weitere Frage aufgetan. Ich möchte nun in einem Objekt eine Liste von registrierten Callback Methoden sichern. Ich hatte eigentlich vor dazu den STL set Container zu nutzen, damit Callback Funktionen nicht doppelt auftreten können.</p>
<p>Da der Container die Implmentation des operator&lt; (oder eines speziellen Sortierobjektes) erwartet habe ich meine CCallback Klasse um diesen Operator erweitern wollen. Leider lässt sich auf einen Methoden Pointer wohl keine klassische Zeigerarithmetic anwenden - somit auch kein Kleins-Als vergleich. Folgender Code lässt sich nicht kompilieren:</p>
<pre><code class="language-cpp">//CCallback::operator&lt;(CCallback&amp; op)
{
    return (this-&gt;m_pCallback &lt; op.m_pCallback) || (this-&gt;m_pReceiver &lt; op.m_pReceiver)
}
</code></pre>
<p>Wie ich gelesen habe lassen sich Pointer auf Methoden auch nicht auf untypisierte Datenzeiger (void*) casten - und wohl auch nicht auf andere ordinale Typen. Wie kann ich nun also meinen STL Container befriedigen und eine operator&lt; Methode implementieren, wenn es keine Möglichkeit gibt meinen Methodenpointer einzuordnen?</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616350</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Tue, 18 Nov 2008 10:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 11:24:24 GMT]]></title><description><![CDATA[<p>Dann nimm doch einen Container, der den &lt; - Operator nicht verlangt..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616398</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 18 Nov 2008 11:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 13:37:43 GMT]]></title><description><![CDATA[<p>Ich hätte zwar gerne std::set benutzt, aber, wenn es keine andere Möglichkeit gibt, muss ich wohl auf einen anderen Container zurück greifen und die Einzigartigkeit der Elemente selbst überprüfen.</p>
<p>Ich habe nun list genommen und habe alles zum Laufen bekommen. Vielen Dank!</p>
<p><a href="http://rafb.net/p/JVHNZ512.html" rel="nofollow">Callback.h</a></p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616476</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Tue, 18 Nov 2008 13:37:43 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 16:53:36 GMT]]></title><description><![CDATA[<p>Du kannst statt <code>operator&lt;</code> auch einen Funktor oder eine Funktion schreiben, welche(r) die Elemente überprüft und als Sortierkriterium an <code>std::set</code> übergeben werden kann.</p>
<p>Denn wenn du in einem sequenziellen Container auf die Einzigartigkeit der Elemente prüfen kannst, sollte es auch möglich sein, das Kriterium vorher festzulegen und damit auch assoziative Container ermöglichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616640</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 Nov 2008 16:53:36 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 19:10:01 GMT]]></title><description><![CDATA[<p>Was genau meinst du mit &quot;das Kriterium vorher festlegen&quot;?<br />
Auf Methoden Pointer lässt sich der == operator anwenden, aber keine ordinalen Operatoren (&lt;, &gt;, &lt;=, &gt;=). Ich habe schon mit dem Gedanken gespielt eine Funktion zu schreiben, die in etwa so aussieht:</p>
<p>Pseudocode</p>
<pre><code class="language-cpp">bool comp(CCallbackClass&amp; op1, CCallbackClass&amp; op2)
{
   if (op1.methodpointer != op2.methodpointer)
   {
      return op1.instancepointer &lt; op2.instancepointer
   }
   else
      return false;
}
</code></pre>
<p>Allerdings dürfte eine solche Funktion wohl jegliche Strukturen, die die STL zum einordnen der Elemente in einem Set nutzen könnte entarten, wenn nicht vielleicht sogar zerstören (ein Binärer Baum würde ganz sicher entarten, ich bin mir nicht ganz sicher wie andere, kompliziertere Strukturen sich verhalten würden) und damit den Sinn des Containers verfehlen.</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616736</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Tue, 18 Nov 2008 19:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Von Method Pointern, Templates und Callback Funktionen on Tue, 18 Nov 2008 20:13:43 GMT]]></title><description><![CDATA[<p>Sorry, ich hatte dich falsch verstanden. Ich dachte, du würdest dann nachträglich die einzelnen Objekte manuell vergleichen. Dabei habe ich übersehen, dass du dann nur auf Gleichheit prüfst.</p>
<p>In dem Fall ist dein jetziger Ansatz besser. Zudem sind ordinale Vergleiche von Zeigern (auch Instanzzeiger) nicht immer definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616784</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 Nov 2008 20:13:43 GMT</pubDate></item></channel></rss>