<?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[Wie ermittle ich den Klassentyp eine Memberfunktionspointers?]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich versuche gerade den Typ der Klasse zu ermitteln, welcher zu einem bestimmten Memberfunktionspointer gehört.</p>
<p>Folglich</p>
<pre><code class="language-cpp">typedef void (A::*fcn)(void)
</code></pre>
<p>das A.</p>
<p>Mein bisheriger Versuch war folgender:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/type_traits/is_same.hpp&gt;

struct A{
    int i;
    A(int u): i(u) {}
    void foo(){
        std::cout &lt;&lt; &quot;A::foo() &quot; &lt;&lt; i &lt;&lt; std::endl;
    }
};

typedef void (A::*fcn)(void);

struct B{
    int i;
    B(int u): i(u) {}
    void foo(){
        std::cout &lt;&lt; &quot;B::foo() &quot; &lt;&lt; i &lt;&lt; std::endl;
    }
};

template&lt; typename R, typename T&gt;
T get_type(R (T::*fcn)(void));

int main(int argc, char **argv){
    A a(1);
    fcn f=&amp;A::foo;
    (a.*f)();
    if ( sizeof(A)==sizeof(get_type(&amp;A::foo)) )
        std::cout &lt;&lt; &quot;A erkannt&quot; &lt;&lt; std::endl;
    if ( sizeof(A)==sizeof(get_type(&amp;B::foo)) )
        std::cout &lt;&lt; &quot;leider hier auch Gleichheit und A erkannt&quot; &lt;&lt; std::endl;
//    if ( boost::is_same&lt; A , get_type(&amp;B::foo)&gt;::value )
//        std::cout &lt;&lt; &quot;A detected&quot; &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p>In meinem code funktioniert soweit die Rückgabe der Typs, aber leider bin ich damit nicht zufrieden, da in den if's halt B::foo zu true evaluiert und ich nicht die Möglichkeit habe den Typ irgendwie weiter zu verwenden. Denn um ein Objekt von diesem Typ anlegen zu können, müsste ich ihn ja bereits kennen und daher scheitert mein Versuch über get_type ...<br />
boost::is_same kann ich daher auch nicht verwenden, da ich halt einen Typ direkt brauche und nicht als Rückgabewert einer Funktion. Muss halt ein konstanter Ausdruck bei Templates sein.</p>
<p>Mein Problem ist nun, wie bekomme ich es hin, so einen Typ zu erhalten. Ein weiterer Vorteile wäre dann auch entsprechende Objekte von diesem Typ anzulegen oder halt als weitere Eingabe in templates zu verwenden.</p>
<p>Danke schon mal im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235879/wie-ermittle-ich-den-klassentyp-eine-memberfunktionspointers</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 02:59:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235879.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Mar 2009 20:47:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 20:47:34 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich versuche gerade den Typ der Klasse zu ermitteln, welcher zu einem bestimmten Memberfunktionspointer gehört.</p>
<p>Folglich</p>
<pre><code class="language-cpp">typedef void (A::*fcn)(void)
</code></pre>
<p>das A.</p>
<p>Mein bisheriger Versuch war folgender:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/type_traits/is_same.hpp&gt;

struct A{
    int i;
    A(int u): i(u) {}
    void foo(){
        std::cout &lt;&lt; &quot;A::foo() &quot; &lt;&lt; i &lt;&lt; std::endl;
    }
};

typedef void (A::*fcn)(void);

struct B{
    int i;
    B(int u): i(u) {}
    void foo(){
        std::cout &lt;&lt; &quot;B::foo() &quot; &lt;&lt; i &lt;&lt; std::endl;
    }
};

template&lt; typename R, typename T&gt;
T get_type(R (T::*fcn)(void));

int main(int argc, char **argv){
    A a(1);
    fcn f=&amp;A::foo;
    (a.*f)();
    if ( sizeof(A)==sizeof(get_type(&amp;A::foo)) )
        std::cout &lt;&lt; &quot;A erkannt&quot; &lt;&lt; std::endl;
    if ( sizeof(A)==sizeof(get_type(&amp;B::foo)) )
        std::cout &lt;&lt; &quot;leider hier auch Gleichheit und A erkannt&quot; &lt;&lt; std::endl;
//    if ( boost::is_same&lt; A , get_type(&amp;B::foo)&gt;::value )
//        std::cout &lt;&lt; &quot;A detected&quot; &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p>In meinem code funktioniert soweit die Rückgabe der Typs, aber leider bin ich damit nicht zufrieden, da in den if's halt B::foo zu true evaluiert und ich nicht die Möglichkeit habe den Typ irgendwie weiter zu verwenden. Denn um ein Objekt von diesem Typ anlegen zu können, müsste ich ihn ja bereits kennen und daher scheitert mein Versuch über get_type ...<br />
boost::is_same kann ich daher auch nicht verwenden, da ich halt einen Typ direkt brauche und nicht als Rückgabewert einer Funktion. Muss halt ein konstanter Ausdruck bei Templates sein.</p>
<p>Mein Problem ist nun, wie bekomme ich es hin, so einen Typ zu erhalten. Ein weiterer Vorteile wäre dann auch entsprechende Objekte von diesem Typ anzulegen oder halt als weitere Eingabe in templates zu verwenden.</p>
<p>Danke schon mal im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675860</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 07 Mar 2009 20:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 21:26:24 GMT]]></title><description><![CDATA[<p>Dafür bräuchtest du Typinferenz, und das funktioniert nicht bei Klassen-, sondern nur bei Funktionstemplates.</p>
<p>In C++0x kannst du so etwas mit <code>decltype</code> und Variadic Templates machen:</p>
<pre><code class="language-cpp">template &lt;typename Class, typename Retval, typename... Args&gt;
    Class memberPointerTypeInferenceHelper (Retval (Class::*) (Args...));
template &lt;typename Class, typename MemberType&gt;
    Class memberPointerTypeInferenceHelper (MemberType Class::*);
#define MEMBERPOINTER_CLASSTYPE(p) decltype (memberPointerTypeInferenceHelper (p))

...

MEMBERPOINTER_CLASSTYPE (&amp;A::foo) a; // a ist vom Typ A
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1675888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675888</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 07 Mar 2009 21:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 21:33:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20436">@mysterio</a>,<br />
Das Beispiel macht nicht all zu viel sinn.</p>
<pre><code class="language-cpp">typedef void (A::*fcn)(void);
</code></pre>
<p><code>fcn</code> kann sowieso nur eine Methode zu einem Typ A aufnehmen. Wieso also noch den Typen probieren herauszufinden?</p>
<p>Vielleicht solltest du dein Problem ein wenig konkreter erläutern. Womöglich gibt es eine andere Möglichkeit.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675890</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 07 Mar 2009 21:33:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 21:44:03 GMT]]></title><description><![CDATA[<p>ich habe ein Delegate geschrieben, dass folgendermaßen benutzt wird,</p>
<pre><code class="language-cpp">struct A{
 void foo(){};
};

...

A a;

Delegate &lt;void&gt; dg; // void ist der Parameter der Funktion und void ist immer Rueckgabewert von Funktionen.
dg.bind&lt;A, &amp;A::foo&gt;(&amp;a);

dg();
</code></pre>
<p>Nun wollte ich den ersten Parameter halt vermeiden und diesen irgendwie erkennen lassen. Automatisch halt, weil z.B. das A ist ja schon in &amp;A::foo drin und da dachte ich, da kommt man wohl irgendwie dran</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675896</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 07 Mar 2009 21:44:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 21:56:04 GMT]]></title><description><![CDATA[<p>Seltsames bind ... Schreib das Ding doch um:</p>
<pre><code class="language-cpp">template&lt;typename ResultT&gt;
class Delegate
{
  // ...
  template&lt;typename ClassT&gt;
  void bind(ResultT (ClassT::*func)(), ClassT&amp; object);
  // ...
};

// Verwendung:
Delegate&lt;void&gt; dg;
dg.bind(&amp;A::foo, a);
</code></pre>
<p>Oder du benutzt gleich Boost.Function in Verbindung mit Boost.Bind. Erscheint mir klüger. Oder du kannst dort kopieren, wie sie es gemacht haben.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675903</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 07 Mar 2009 21:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:12:57 GMT]]></title><description><![CDATA[<p>Stimmt schon, dass man boost verwenden könnte, aber ich programmiere für eine Plattform (AVR) die nicht so richtig <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="😉"
    /> von boost unterstützt wird. Und außerdem ist meine Delegatevariante ressourcenschonender. Ich brauche weniger RAM als die boost delegates über boost::function und auf einem microcontroller ist dies halt von Bedeutung. Aber sei es drum, ansonsten hast Du recht und ich würde sonst immer zu boost greifen, .....</p>
<p>Nun aus oben genannten Gründen und natürlich auch aus Interesse versuche ich halt einen anderen möglichen Weg. Ich kann auch mit meiner ursprünglichen Form</p>
<pre><code class="language-cpp">db.bind&lt;A, &amp;A::foo&gt;(&amp;a);
</code></pre>
<p>leben, aber schöner wäre die direkte Bestimmung der Klasse aus dem Templateparameter. Wäre halt übersichtlicher meines erachtens.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a><br />
das mit dem C++0x geht. Die Frage ist, ob es auch mit den bisherigen Bortmitteln des aktuellen Standards geht.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675910</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:12:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:16:15 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Seltsames bind ... Schreib das Ding doch um: [...]</p>
</blockquote>
<p>Das schränkt die Möglichkeiten deutlich ein. Mit seiner bind()-Methode kann er so etwas machen:</p>
<pre><code class="language-cpp">template &lt;typename Retval = void&gt;
    class Delegate
{
    template &lt;typename Class, Retval (Class::*Method) (void)&gt;
        static Retval methodPointerInvoker (void* data)
    { return (static_cast &lt;Class*&gt; (data)-&gt;*Method) (); }

    Retval (*invoker) (void*);
    void* data;

public:
    template &lt;typename Class, Retval (Class::*Method) (void)&gt;
        void bind (Class* obj)
    {
        data = obj;
        invoker = methodPointerInvoker &lt;Class, Method&gt;;
    }
};
</code></pre>
<p>Sicher, auch das hat Nachteile, aber es macht Delegates ein gutes Stück effizienter.</p>
<p>Allerdings würde ich als Workaround für dieses fundamentale Sprachdefizit von C++ <a href="http://www.codeproject.com/KB/cpp/FastDelegate.aspx" rel="nofollow">Fast Delegates</a> empfehlen. boost::function ist ganz nett, aber wundervoll ineffizient.</p>
<p>mysterio schrieb:</p>
<blockquote>
<p>das mit dem C++0x geht. Die Frage ist, ob es auch mit den bisherigen Bortmitteln des aktuellen Standards geht.</p>
</blockquote>
<p>Leider nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675914</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:16:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:22:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20436">@mysterio</a>,<br />
Aber nicht Atmel AVR? <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>Naja, man könnte ein wenig bescheissen, dann geht das auch:</p>
<pre><code class="language-cpp">template&lt;typename FuncT, typename ClassT&gt;
void bind(ClassT&amp; object);

// Verwendung:
bind&lt;&amp;A::Foo&gt;(a);
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675918</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:29:25 GMT]]></title><description><![CDATA[<p>Genau, so in der Art sieht mein Delegate aus und FastDelegates kenne ich auch. Habe auch schon drüber nachgedacht diese zu nutzen, aber brauchen halt auf dem AVR 33% mehr RAM. Statt 4Byte eben 6Byte. Klingt zwar erstmal nicht wirklich viel, aber wenn man mehrere hat und man bedenkt, dass manche AVR nicht mal 1kB RAM besitzen, muss man schon mal aufpassen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a><br />
Doch Atmel AVR und ich werde deinen Vorschlag mal testen.</p>
<p>Danke nochmals für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675923</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:29:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:40:07 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a><br />
leider funktioniert es nicht mit dem von Dir vorgeschlagenen bind zumindest nicht bei mir. Vielleicht habe ich auch was falsch gemacht, aber ich habe es einfach mal im code von audacia getestet und es führte leider nicht zum Erfolg.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675930</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:43:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20436">@mysterio</a>,<br />
1. Geht nicht, ist keine Fehlerbeschreibung.<br />
2. Was genau hast du gemacht? <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>Und zu Atmel AVR ... WAAAAAARRRRGGGHHHH<br />
Da habe ich letztes Jahr grauenhafte Assemblererfahrungen damit gemacht <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675932</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:43:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:51:42 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Naja, man könnte ein wenig bescheissen, dann geht das auch:</p>
<pre><code class="language-cpp">template&lt;typename FuncT, typename ClassT&gt;
void bind(ClassT&amp; object);

// Verwendung:
bind&lt;&amp;A::Foo&gt;(a);
</code></pre>
</blockquote>
<p>&amp;A::Foo ist kein Typ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675936</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:51:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 22:58:50 GMT]]></title><description><![CDATA[<p>genau wie audacia.</p>
<p>Hier der code:</p>
<pre><code class="language-cpp">template &lt;typename Retval = void&gt;
    class Delegate
{
    template &lt;typename Class, Retval (Class::*Method) (void)&gt;
        static Retval methodPointerInvoker (void* data)
    { return (static_cast &lt;Class*&gt; (data)-&gt;*Method) (); }

    Retval (*invoker) (void*);
    void* data;

public:
    template &lt;typename Class, Retval (Class::*Method) (void)&gt;
        void bind (Class* obj)
    {
        data = obj;
        invoker = methodPointerInvoker &lt;Class, Method&gt;;
    }
    template&lt;typename Func, typename Class&gt;
    void bind(Class* obj){
        data = obj;
        invoker = methodPointerInvoker &lt;Class, Func&gt;;
    }
};

struct A{
    void foo(){}
};

int main(int argc, char** argv){
    A a;
    Delegate&lt;void&gt; dg, dg1;
    dg.bind&lt;A, &amp;A::foo&gt;(&amp;a);
    dg1.bind&lt;&amp;A::foo&gt;(&amp;a);

    return 0;
}
</code></pre>
<p>das erste bind funktioniert und bei zweiten weiss der compiler nicht, was er machen soll</p>
<p>Fehlermeldung des compilers</p>
<pre><code>Delegate.cc::33: error: no matching function for call to ‘Delegate&lt;void&gt;::bind(A*)’
</code></pre>
<p>über weitere Vorschläge würde ich mich freuen.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675940</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 07 Mar 2009 22:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sat, 07 Mar 2009 23:08:07 GMT]]></title><description><![CDATA[<p>Ehm, natürlich, audacia, hast recht. Hmmm, ich glaube ich sollte besser ins Nest gehen. Bin heute schon viel zu lange auf den Beinen ...<br />
Ich werde mir das morgen/heute nochmals genauer anschauen. Vielleicht hat in der Zwischenzeit jemand eine Idee...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675945</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 07 Mar 2009 23:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 01:17:49 GMT]]></title><description><![CDATA[<p>Gibe es einen Grund nicht boost::function&lt;&gt; zu verwenden?<br />
boost::function&lt;&gt; ist für &quot;bloss ein gebundener mem-fn-pointer&quot; Fälle optimiert, d.h. es findet beim &quot;binden&quot; keine dynamische Speicherallokation statt.</p>
<p>Weiss nicht wozu man sich dann was eigenes stricken sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675975</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 08 Mar 2009 01:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 02:22:03 GMT]]></title><description><![CDATA[<p>mysterio schrieb:</p>
<blockquote>
<p>Genau, so in der Art sieht mein Delegate aus und FastDelegates kenne ich auch. Habe auch schon drüber nachgedacht diese zu nutzen, aber brauchen halt auf dem AVR 33% mehr RAM. Statt 4Byte eben 6Byte. Klingt zwar erstmal nicht wirklich viel, aber wenn man mehrere hat und man bedenkt, dass manche AVR nicht mal 1kB RAM besitzen, muss man schon mal aufpassen.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1675983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675983</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 08 Mar 2009 02:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 03:47:59 GMT]]></title><description><![CDATA[<p>Upps.<br />
Jo hätte ich mal genauer lesen sollen <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/1675989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675989</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 08 Mar 2009 03:47:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 12:42:12 GMT]]></title><description><![CDATA[<p>Ich wusste doch, dass es möglich ist. Naja, zumindest habe ich eine Lösung gefunden. Wie gut die ist, darüber lässt sich natürlich streiten. Die Lösung ist ein Proxy, welcher entsprechende Typinformationen mitträgt. Fehlerbehandlungen habe ich noch nicht eingebaut, das überlasse ich gerne dem Anwender, es soll ja nur eine Idee präsentieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename RetT = void&gt;
class Delegate
{
	// Static functions //
private:
	template&lt;typename ClassT, RetT (ClassT::*Method)()&gt;
	static RetT methodPointerInvoker(void* data)
	{
		return (static_cast&lt;ClassT*&gt;(data)-&gt;*Method)();
	}

	// Structs //
private:
	template&lt;typename ClassT&gt;
	class Proxy
	{
	private:
		ClassT* m_object;
		Delegate* m_delegate;

	public:
		Proxy(ClassT* object, Delegate* dg)
			: m_object(object)
			, m_delegate(dg)
		{
		}

	public:
		template&lt;RetT (ClassT::*FUNC)()&gt;
		void set() const
		{
			m_delegate-&gt;m_invoker = &amp;methodPointerInvoker&lt;ClassT, FUNC&gt;;
		}
	};

	// Attributes //
private:
	RetT (*m_invoker)(void*);
	void* m_data;

	// Operators //
public:
	RetT operator ()()
	{
		return (*m_invoker)(m_data);
	}

	// Methods //
public:
	template&lt;typename ClassT&gt;
	Proxy&lt;ClassT&gt; const bind(ClassT* obj)
	{
		m_data = obj;
		return Proxy&lt;ClassT&gt;(obj, this);
	}
};

struct A
{
	void foo()
	{
		std::cout &lt;&lt; &quot;foo&quot; &lt;&lt; std::endl;
	}
};

int main()
{
	A a;

	Delegate&lt;void&gt; dg;
	dg.bind(&amp;a).set&lt;&amp;A::foo&gt;();

	dg();

	return 0; 
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676085</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 08 Mar 2009 12:42:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 13:05:57 GMT]]></title><description><![CDATA[<p>Kleiner Zusatz für Schreibfaule, oder wenn du einfach eine angenehm lesbare Funktion haben willst:</p>
<pre><code class="language-cpp">#define BIND_TO_DELEGATE(dg, obj, func) \
	dg.bind(obj).set&lt;func&gt;()

int main()
{
    A a;

    Delegate&lt;void&gt; dg;
    BIND_TO_DELEGATE(dg, &amp;a, &amp;A::foo);

    dg();

    return 0; 
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676097</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 08 Mar 2009 13:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 19:19:46 GMT]]></title><description><![CDATA[<p>Ja, diese Version funktioniert soweit gut. Ob sie bzgl. Ressourcen ebenso effizent ist, wie die erste Version weiss ich noch nicht, da ich noch keine genauen Tests gemacht habe. Ich werde es aber mal untersuchen und dann hier schreiben.</p>
<p>Wenn ich es aber richtig ueberblicke, wird sich moeglicherweise nicht viel aendern, da ja nur ein temporaeres Proxy-Objekt angelegt wird und dies kann der Compiler bestimmt wegoptimieren.</p>
<p>Die urspruengliche Frage ist ja auch beantwortet, dass es mit dem aktuellen Standard halt nicht geht, aber im C++0X ein neues Sprachkonstrukt genau dies ermoeglicht.</p>
<p>Auf jeden Fall danke und ich habe mal wieder viel gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676331</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sun, 08 Mar 2009 19:19:46 GMT</pubDate></item><item><title><![CDATA[Reply to Wie ermittle ich den Klassentyp eine Memberfunktionspointers? on Sun, 08 Mar 2009 20:13:44 GMT]]></title><description><![CDATA[<p>Also ich habe mal Groessenmessungen gemacht. Auf dem PC sind mit der Proxyvariante bei -Os Optimierung 16 Byte Text mehr und RAM ist bei beiden gleich, beim RAM sollte es ja auch so sein ... Text ist aber eh nicht ganz so kritisch auch selbst beim AVR nicht.</p>
<p>Dann habe ich auch noch Messungen mit einem avr-g++ gemacht und dort oh Ueberraschung -- beide Varianten liefern hier die gleichen Ergebnisse.</p>
<p>Nun weiss ich nicht ganz, ob es an der Version des Compilers liegt, da ich auf dem PC g++ in Version 4.3.2 und fuer den AVR in Version 4.2.1 benutze.</p>
<p>Bin sonst aber ganz zufrieden. Nochmals Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676358</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sun, 08 Mar 2009 20:13:44 GMT</pubDate></item></channel></rss>