<?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[Container mit verschiedenen Methodenpointern]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">struct Base {};

struct A : public Base
{
     P* bla(P*);
};

struct B : public Base
{
     P* blub(P*);
};

struct C : public Base
{
     P* blib(P*);
};
</code></pre>
<p>Jetzt hätte ich gerne sowas:</p>
<pre><code class="language-cpp">map&lt;Name, P* (T::*memfn)(P*)&gt; mappi;
</code></pre>
<p>Das Problem ist hier nur das T. Wie kann ich versch. Typen da rein packen. Boost is not allowed ...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251488/container-mit-verschiedenen-methodenpointern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 11:12:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251488.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Oct 2009 07:24:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Tue, 06 Oct 2009 07:24:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">struct Base {};

struct A : public Base
{
     P* bla(P*);
};

struct B : public Base
{
     P* blub(P*);
};

struct C : public Base
{
     P* blib(P*);
};
</code></pre>
<p>Jetzt hätte ich gerne sowas:</p>
<pre><code class="language-cpp">map&lt;Name, P* (T::*memfn)(P*)&gt; mappi;
</code></pre>
<p>Das Problem ist hier nur das T. Wie kann ich versch. Typen da rein packen. Boost is not allowed ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788516</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 06 Oct 2009 07:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Tue, 06 Oct 2009 07:48:57 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Wie kann ich versch. Typen da rein packen.</p>
</blockquote>
<p>Garnicht. Selbst mit boost dürfte das schwierig werden, weil du eben immernoch die Typinformation irgendwo mitschleifst. Ich könnte mir höchstens vorstellen dass das mit einem boost::any oder ähnlichem und einigem Gefrickel machbar ist.</p>
<blockquote>
<p>Boost is not allowed ...</p>
</blockquote>
<p>Warum nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788523</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 06 Oct 2009 07:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Tue, 06 Oct 2009 08:05:13 GMT]]></title><description><![CDATA[<p>Hrmpf,<br />
der Code landet nachher auf nem µC, der nicht gerade viel C++ versteht. Zudem gibts da nen Nein vom Cheff <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>Was für Möglichkeiten gibts noch um das Problem zu lösen:<br />
Habe mehrere Komponenten, die gemeinsam kommunizieren sollen. Das Ganze über RPC. Es wird nur P* rumgereicht. Ich würde halt gerne sowas machen:</p>
<pre><code class="language-cpp">struct A {
  void do() { s.call(&quot;B::Blub&quot;, pobj); }
};

struct B {
  B() { s.registerF(&amp;B::Blub, &quot;B::Blub&quot;); }
  P* blub(P* p) { ... }
};
</code></pre>
<p>Ne RPC schicht gibts es drunter schon, die alle Komponenten kennt. Muss nur was drüber basteln, um die gewünschte Elementfunktion einer Komponente aufrufen zu können.</p>
<p>Edit: Oh, da fällt mir doch was ein ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788532</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 06 Oct 2009 08:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Tue, 06 Oct 2009 08:44:42 GMT]]></title><description><![CDATA[<p>Wenn du die Basisklasse verändern darfst sollte ne virtuelle Funktion tun, die dann in der jeweiligen abgeleiteten Klasse auf die eigentliche Funktuion redirected.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788552</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 06 Oct 2009 08:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Tue, 06 Oct 2009 09:43:40 GMT]]></title><description><![CDATA[<p>Du könntest dir deinen eigenen Wrapper bauen, z.B. sowas hier:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

struct A
{
	int* funcA( int* p )
	{
		cout &lt;&lt; &quot;A::funcA(): &quot; &lt;&lt; *p &lt;&lt; endl;
		return p;
	}
};

struct B
{
	int* funcB( int* p )
	{
		cout &lt;&lt; &quot;B::funcB(): &quot; &lt;&lt; *p &lt;&lt; endl;
		return p;
	}
};

template&lt;typename R, typename P1&gt;
struct ICaller
{
	virtual ~ICaller() {	}
	virtual R operator()( P1 p ) = 0;
};

template&lt;typename T,typename R,typename P1&gt;
class Caller : public ICaller&lt;R,P1&gt;
{
	typedef R (T::*pfnMemFun)( P1 );

	T&amp;          Object;
	pfnMemFun 	Member;

public:
	Caller( T&amp; o, pfnMemFun m ) :
		Object( o ),
		Member( m )
	{
	}

	R operator()( P1 p )
	{
		return (Object.*Member)( p );
	}
};

int main()
{
	typedef ICaller&lt;int*,int*&gt; IntPtrCaller;
	typedef std::vector&lt;IntPtrCaller*&gt; CallerVector;

	A anA;
	B anB;

	Caller&lt;A,int*,int*&gt; CallA( anA, &amp;A::funcA );
	Caller&lt;B,int*,int*&gt; CallB( anB, &amp;B::funcB );

	CallerVector v;

	v.push_back( &amp;CallA );
	v.push_back( &amp;CallB );

	int i = 5;

	for( CallerVector::iterator it = v.begin(); it != v.end(); ++it )
	{
		(**it)( &amp;i );
	}
}
</code></pre>
<p>Dabei müssen die Objekte nichtmal vom gleichen Typ sein, lediglich die Methodensignatur muss übereinstimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788580</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 06 Oct 2009 09:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Wed, 07 Oct 2009 01:37:45 GMT]]></title><description><![CDATA[<p>Perfekt DocShoe, vielen Dank. Ich glaube damit kann ich was anfangen <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/1788977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788977</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 07 Oct 2009 01:37:45 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Wed, 07 Oct 2009 13:38:32 GMT]]></title><description><![CDATA[<p>Oder auch etwas &quot;weniger dynamisch&quot;, ganz ohne Heap und virtuelle Funktionen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

typedef char P;

// -----[ Magie beginnt hier ]-----

template&lt; class Klasse, P* (Klasse::*MemFun)(P*) &gt;
struct wrappiPP
{
  // jede Klasse/MemFun-Kombination bekommt ihre eigene
  // invoke-Funktion, die den Parameter weiterleitet...
  static P* invoke(void* pObjekt, P* arg) {
    return (static_cast&lt;Klasse*&gt;(pObjekt)-&gt;*MemFun)(arg);
  }
};

class delegatePP
{
  void* pObj;          //&lt; Zeiger auf das Objekt
  P* (*pf)(void*,P*);  //&lt; Zeiger auf die invoke-Funktion, siehe oben

  // privater ctor (der Typ-Sicherheit wegen)
  delegatePP(void* o, P*(*pf)(void*,P*)) : pObj(o),pf(pf) {}

public:
  // &quot;Nullzeiger&quot;
  delegatePP() : pObj(0), pf(0) {}

  P* operator()(P* arg) const { return pf(pObj,arg); }

  // erzeugt ein neues delegatePP-Objekt
  template&lt;class Klasse, P*(Klasse::*MemFun)(P*), class K2&gt;  
  static delegatePP make(K2* pObj2) {
    Klasse* pObj1 = pObj2;
    return delegatePP(pObj1,wrappiPP&lt;Klasse,MemFun&gt;::invoke);
  }
};

// -----[ Magie endet hier ]-----

struct A {
  P* dings(P*) {std::cout&lt;&lt;&quot;A::dings\n&quot;; return 0;}
};

struct B {
  P* bums(P*) {std::cout&lt;&lt;&quot;B::bums\n&quot;; return 0;}
};

void machdat( delegatePP d )
{
  d(0);
}

int main()
{
  A a;
  B b;
  delegatePP x;
  x = delegatePP::make&lt;A,&amp;A::dings&gt;(&amp;a);
  machdat( x );
  x = delegatePP::make&lt;B,&amp;B::bums&gt;(&amp;b)
  machdat( x );
}
</code></pre>
<p>Edit: Habe versucht, das etwas leserlicher und leichter nachvollziehbar zu gestalten.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789077</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 07 Oct 2009 13:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Wed, 07 Oct 2009 12:18:51 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Sorry Sebastian ... eigentlich bist Du mein Held, aber Docs Code finde ich trotzdem gleichzeitig übersichtlicher als auch schöner und besser zu verwenden und zu verstehen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Aber vielleicht hat Dein Ansatz ja Vorteile, die sich mir nicht auf Anhieb erschließen...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789193</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Oct 2009 12:18:51 GMT</pubDate></item><item><title><![CDATA[Reply to Container mit verschiedenen Methodenpointern on Wed, 07 Oct 2009 13:51:16 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Aber vielleicht hat Dein Ansatz ja Vorteile, die sich mir nicht auf Anhieb erschließen...</p>
</blockquote>
<p>Das erklärte Ziel des OPs war es doch, eine Art &quot;Funktionszeiger&quot; zu benutzen. delegatePP kommt einem Funktions-Zeiger sehr nahe, wobei ICaller&lt;&gt;* eher etwas wie ein Zeiger auf ein Funktionszeiger ist. Man muss sich also noch um die Verwaltung eines Caller-Objektes kümmern.</p>
<p>Natürlich lässt sich so ein ICaller&lt;&gt;* Zeiger in einem Wrapper verpacken, der im Destruktor das Caller-Objekt wieder löscht. Dann verhält sich dieser Wrapper wieder wie eine Art Funktionszeiger. Boost.Function macht das fast genauso.</p>
<p>delegatePP ist einfach eine relativ spezielle Lösung -- speziell für Elementfunktionen einer bestimmten Signatur P*(P*). Diese Lösung emuliert einen Funktionszeiger ohne Freispeicherzugriff und virtuellen Funktionen. Gut, Caller&lt;&gt; ist auch relativ speziell, muss es aber gar nicht sein. Man hätte im Caller-Template beliebige Funktionsobjekte speichert können, statt sich auf Elementfunktionszeiger zu beschränken. ... Was ich damit sagen will ist, dass wenn man nur Objektzeiger und Funktionszeiger speichern will, nicht diese zusätzliche Indirektion benötigt.</p>
<p>Was jetzt besser oder schlechter ist, hängt von den genauen Anforderungen und den &quot;use cases&quot; ab. So etwas wie Boost.Function (oder derartige Nachahmungen) ist natürlich sehr flexibel. Man muss aber auch einen relativ großen Aufwand betreiben, um etwas derartiges performant zu machen (Eine naive Boost.Funktion-Implementierung würde im Copy-Ctor eine virtuelle clone()-Funktion des Quell-Objektes aufrufen etc).</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789236</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 07 Oct 2009 13:51:16 GMT</pubDate></item></channel></rss>