<?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[Zeiger auf Methoden als Parameter]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich habe folgendes Problem:<br />
ich habe mehrere Methode, die an sich fast das gleiche machen. Es gibt nur 2 Unterschiede: 2 verschiedene Objekttypen und bei einem Typen wird in der Methode jeweils eine andere Methode aufgerufen. Da die halt so ähnlich sind, wollte ich das gerne zu einer Methode zusammen fassen.<br />
So verschiedene Typen ist ja kein Problem: templates!<br />
Aber ich weis nicht so recht, wie ich die Methoden als Parameter übergeben soll.</p>
<p>Das habe ich bisher:</p>
<pre><code class="language-cpp">typedef double (*getValue)(double);
//
template&lt;class T&gt;
bool drawData(T&amp; obj,typename T::getValue methode,CStaticOGL&amp; statControl);

...

//
template&lt;class T&gt;
bool CDialogFunction::drawData(T&amp; obj,typename T::getValue methode,CStaticOGL&amp; statControl)
{
    try
    {
	    vector&lt;Vertex2d&gt; points;
	    points.reserve((int)(m_dtSpline * 361.0));

	    float minValue = (float)obj.*methode(degreeToRad(0.0));

    usw.
</code></pre>
<p>Das haut aber noch nicht so richtig hin. Die Methoden sind in den eigentlichen Klassen dann auch zusätzlich noch const. Inwieweit muss dass denn dann mit einfließen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174308/zeiger-auf-methoden-als-parameter</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 15:38:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174308.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Feb 2007 13:42:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Methoden als Parameter on Sun, 25 Feb 2007 13:42:28 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich habe folgendes Problem:<br />
ich habe mehrere Methode, die an sich fast das gleiche machen. Es gibt nur 2 Unterschiede: 2 verschiedene Objekttypen und bei einem Typen wird in der Methode jeweils eine andere Methode aufgerufen. Da die halt so ähnlich sind, wollte ich das gerne zu einer Methode zusammen fassen.<br />
So verschiedene Typen ist ja kein Problem: templates!<br />
Aber ich weis nicht so recht, wie ich die Methoden als Parameter übergeben soll.</p>
<p>Das habe ich bisher:</p>
<pre><code class="language-cpp">typedef double (*getValue)(double);
//
template&lt;class T&gt;
bool drawData(T&amp; obj,typename T::getValue methode,CStaticOGL&amp; statControl);

...

//
template&lt;class T&gt;
bool CDialogFunction::drawData(T&amp; obj,typename T::getValue methode,CStaticOGL&amp; statControl)
{
    try
    {
	    vector&lt;Vertex2d&gt; points;
	    points.reserve((int)(m_dtSpline * 361.0));

	    float minValue = (float)obj.*methode(degreeToRad(0.0));

    usw.
</code></pre>
<p>Das haut aber noch nicht so richtig hin. Die Methoden sind in den eigentlichen Klassen dann auch zusätzlich noch const. Inwieweit muss dass denn dann mit einfließen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235139</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Sun, 25 Feb 2007 13:42:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden als Parameter on Mon, 26 Feb 2007 15:47:16 GMT]]></title><description><![CDATA[<p>*push*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235854</guid><dc:creator><![CDATA[Pellaeon_home]]></dc:creator><pubDate>Mon, 26 Feb 2007 15:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden als Parameter on Mon, 26 Feb 2007 17:17:49 GMT]]></title><description><![CDATA[<p>Wenn es sich um Methoden handelt, ist</p>
<p>Pellaeon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef double (*getValue)(double);
</code></pre>
</blockquote>
<p>schon mal nicht richtig, denn das ist ein Funktionszeiger. Methodenzeiger deklariert man folgendermaßen:</p>
<pre><code class="language-cpp">typedef [modifiers] &lt;returnvalue&gt; (&lt;class&gt;::*&lt;name&gt;) (&lt;arguments&gt;) [const];
</code></pre>
<p>Wie man sieht, ist hier die Angabe einer Klasse vonnöten, das typedef ist also typabhängig. Da es keine typedef-Templates gibt, muß man sich hier mit einer Struktur behelfen:</p>
<pre><code class="language-cpp">template &lt;class T&gt; struct getvaluemethod_t
{ typedef double (T::*type) (double) const; };
</code></pre>
<p>Und schon kannst du dein Funktionstemplate schreiben:</p>
<pre><code class="language-cpp">class MyClass
{
public:
    double getValue (double warumUebernimmtEineGetValueFunktionBlossEinenParameter) const
    { return 2.0; }
};

template &lt;class T&gt; void someFunctionTemplate (const T&amp; obj, typename getvaluemethod_t &lt;T&gt;::type getValueFunc)
{
    (obj.*getValueFunc) (12.34);
}

...

MyClass mc;
someFunctionTemplate (mc, &amp;MyClass::getValue);
</code></pre>
<p>Wenn die Adresse der Funktion bereits zur Kompilierzeit bekannt ist, ist allerdings die folgende Variante besser:</p>
<pre><code class="language-cpp">template &lt;class T, typename getvaluemethod_t &lt;T&gt;::type GetValueFunc&gt; void anotherFunctionTemplate (const T&amp; obj)
{
    (obj.*GetValueFunc) (56.78);
}

...

MyClass mc;
anotherFunctionTemplate &lt;MyClass, &amp;MyClass::getValue&gt; (mc);
</code></pre>
<p>Hier wird die Adresse der Funktion als Template-Argument übergeben, kann also statisch gelinkt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235910</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 26 Feb 2007 17:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden als Parameter on Mon, 26 Feb 2007 21:19:25 GMT]]></title><description><![CDATA[<p>THX, genau das habe ich gesucht. Wär evtl was fürs FAQ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236055</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 26 Feb 2007 21:19:25 GMT</pubDate></item></channel></rss>