<?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[Template-Auflösung mit Zeiger auf Memberfunktionen]]></title><description><![CDATA[<p>Hi,</p>
<p>zunächst der einfache Fall:</p>
<p>Ich erzeuge für diverse freie Funktionen via Template Spezialisierungen:</p>
<pre><code class="language-cpp">void f1() {};
void f2() {};

template&lt;void(*pf)()&gt;
class Cl
{
public:
	void go()
	{
		pf();  // &lt;- dazu kommen wir gleich
	}
};

Cl&lt;f1&gt; o;
o.go();
</code></pre>
<p>Nun möchte ich aber f1/f2 als Memberfunktionen einer Klasse implementieren:</p>
<pre><code class="language-cpp">class Dida
{
public:
   void f1();
   void f2();
};
</code></pre>
<p>Natürlich ändern wir jetzt noch go, damit jeder zufrieden ist:</p>
<pre><code class="language-cpp">void Cl:go(Dida&amp; dida)
{
...
}
</code></pre>
<p>Also ist nun das Objekt da, etc. Meine Quizfragen:</p>
<ol>
<li>wie sieht der Templateparameter aus?</li>
<li>wie der Aufruf innerhalb von go()</li>
<li>wie die Instanziierung des Templates?</li>
</ol>
<p>Grundsätzlich sollte die Vorgehensweise bei Memberfunktionen analog zu freien/statischen Funktionen doch möglich sein, aber ich bekomme das nicht richtig compiliert.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253037/template-auflösung-mit-zeiger-auf-memberfunktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 04:02:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253037.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Oct 2009 21:57:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Tue, 27 Oct 2009 21:57:06 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>zunächst der einfache Fall:</p>
<p>Ich erzeuge für diverse freie Funktionen via Template Spezialisierungen:</p>
<pre><code class="language-cpp">void f1() {};
void f2() {};

template&lt;void(*pf)()&gt;
class Cl
{
public:
	void go()
	{
		pf();  // &lt;- dazu kommen wir gleich
	}
};

Cl&lt;f1&gt; o;
o.go();
</code></pre>
<p>Nun möchte ich aber f1/f2 als Memberfunktionen einer Klasse implementieren:</p>
<pre><code class="language-cpp">class Dida
{
public:
   void f1();
   void f2();
};
</code></pre>
<p>Natürlich ändern wir jetzt noch go, damit jeder zufrieden ist:</p>
<pre><code class="language-cpp">void Cl:go(Dida&amp; dida)
{
...
}
</code></pre>
<p>Also ist nun das Objekt da, etc. Meine Quizfragen:</p>
<ol>
<li>wie sieht der Templateparameter aus?</li>
<li>wie der Aufruf innerhalb von go()</li>
<li>wie die Instanziierung des Templates?</li>
</ol>
<p>Grundsätzlich sollte die Vorgehensweise bei Memberfunktionen analog zu freien/statischen Funktionen doch möglich sein, aber ich bekomme das nicht richtig compiliert.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1799400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799400</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Tue, 27 Oct 2009 21:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Tue, 27 Oct 2009 22:12:59 GMT]]></title><description><![CDATA[<p>Meinst Du so?</p>
<pre><code class="language-cpp">template&lt;class K, void (K::*pmf)()&gt;
class Cl
{
public:
    void go(K &amp; blah)
    {
        (blah.*pmf)();
    }
};

...
Dida d;
Cl&lt;Dida,&amp;Dida::f1&gt; o;
o.go(d);
</code></pre>
<p>(ungetestet)</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1799402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799402</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 27 Oct 2009 22:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Tue, 27 Oct 2009 22:34:26 GMT]]></title><description><![CDATA[<p>Das hätte ich noch erwähnen sollen, ich würde das gerne nur mit einem Template-Parameter machen.</p>
<p>Deine Lösung funktioniert.</p>
<p>Ich hatte mir überlegt, ob genug Informationen vorliegen nur mit &lt;void (K::*pmf)()&gt;. Ich wollte gerne in der Instanziierung die Redundanz der Erwähnung der Klasse Dida in &lt;Dida, &amp;Dida::f&gt; vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1799413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799413</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Tue, 27 Oct 2009 22:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Wed, 28 Oct 2009 08:53:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#define CL(klasse,memfun) Cl&lt;klasse,&amp;klasse::memfun&gt;

...
Dida d;
CL(Dida,f1) o;
o.go(d);
</code></pre>
<p><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="😉"
    /></p>
<p>Sonst sehe ich keine Möglichkeit. In C++0x könnte man noch so etwas machen:</p>
<pre><code class="language-cpp">template&lt;class K, void (K::*Pmf)()&gt;
inline Cl&lt;K,Pmf&gt; make_cl_obj(void (K::*Pmf)())
{
  return {};
}

...
Dida d;
auto o = make_cl_obj(&amp;Dida::f1);
o.go(d);
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1799485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799485</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 28 Oct 2009 08:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Wed, 28 Oct 2009 13:59:33 GMT]]></title><description><![CDATA[<p>Wenn ich das Problem noch weiter einschränke und einen Freiheitsgrad reduziere:</p>
<p>Das Objekt ist immer(!) vom Typ &quot;Dida&quot;. D.h. über den Funktionszeiger kommen nur Memberfunktionen Dida::memfun rein. Ich muß kein Klassenswitching betreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1799680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799680</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Wed, 28 Oct 2009 13:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Wed, 28 Oct 2009 14:12:13 GMT]]></title><description><![CDATA[<p>Ja und? Bist Du jetzt nicht in der Lage, den Template-Parameter &quot;class K&quot; rauszuschmeißen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1799696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799696</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 28 Oct 2009 14:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Auflösung mit Zeiger auf Memberfunktionen on Wed, 28 Oct 2009 17:33:26 GMT]]></title><description><![CDATA[<p>Argl. Jetzt sehe ich meinen Fehler, ich hatte (sinngemäß) in go noch den Templateparameter stehen statt dem Klassennamen.</p>
<p>Danke für den Hinweis. <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/1799844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1799844</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Wed, 28 Oct 2009 17:33:26 GMT</pubDate></item></channel></rss>