Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Lambda Funktion einem Funktionspointer einer Klasse zuweisen

45 views
Skip to first unread message

Andreas Tscharner

unread,
May 2, 2012, 8:28:52 AM5/2/12
to
Hallo Welt,

Ich habe z.B. folgende Klasse

class CalcClass
{
private:
double (CalcClass::*convert)(double);

public:
CalcClass(bool);

double calculate(double, double);
};

In meinem Konstruktor möchte ich nun, anhängig von dem übergebenen
bool - Wert den Funktionspointer mit einer Lambda Funktion "füllen":

CalcClass::CalcClass(bool p_inches)
{
if (p_inches)
convert = [](double p_mm)->double { return p_mm/25.4; };
else
convert = [](double p_mm)->double { return p_mm; };
}

sodass ich nachher in meiner "calculate" Methode "convert" ganz
einfach aufrufen kann

double CalcClass::calculate(double p_val1, double p_val2)
{
return convert(p_val1 * p_val2);
}


Leider funktioniert diese Methode nicht, da ich im Konstruktor einem
Funktionspointer eine Lambda Funktion zuweise.

Was muss ich anders machen, damit das klappt?

Besten Dank und Gruss
Andreas

Daniel Krügler

unread,
May 2, 2012, 2:04:51 PM5/2/12
to
Am Mittwoch, 2. Mai 2012 14:28:52 UTC+2 schrieb Andreas Tscharner:
> Hallo Welt,
>
> Ich habe z.B. folgende Klasse
>
> class CalcClass
> {
> private:
> double (CalcClass::*convert)(double);

Hier liegt dein Problem: convert ist kein Funktionszeiger (function pointer), sondern ein Elementfunktionszeiger (pointer to member). Ein zustandsloser Lambda-Ausdruck ist konvertierbar zu einem Funktionszeiger, nicht aber zu einem Elementfunktionszeiger.

> public:
> CalcClass(bool);
>
> double calculate(double, double);
> };
>
> In meinem Konstruktor möchte ich nun, anhängig von dem übergebenen
> bool - Wert den Funktionspointer mit einer Lambda Funktion "füllen":
>
> CalcClass::CalcClass(bool p_inches)
> {
> if (p_inches)
> convert = [](double p_mm)->double { return p_mm/25.4; };
> else
> convert = [](double p_mm)->double { return p_mm; };
> }

Damit dies geht, solltest du 'convert' anders definieren. Es gibt keinen Grund (in deinem Beispiel jedenfalls nicht), warum es ein Elementfunktionszeiger sein müsste. Ändere die Definition einfach ab zu:

double (*convert)(double);

> sodass ich nachher in meiner "calculate" Methode "convert" ganz
> einfach aufrufen kann
>
> double CalcClass::calculate(double p_val1, double p_val2)
> {
> return convert(p_val1 * p_val2);
> }
>
>
> Leider funktioniert diese Methode nicht, da ich im Konstruktor einem
> Funktionspointer eine Lambda Funktion zuweise.
>
> Was muss ich anders machen, damit das klappt?

Wie oben gezeigt: Die Definition von convert ändern.

Besten Gruss aus Bremen,

Daniel Krügler

sterne...@gmail.com

unread,
May 3, 2012, 9:49:48 AM5/3/12
to
On Wednesday, May 2, 2012 8:04:51 PM UTC+2, Daniel Krügler wrote:

[snip]
> > Was muss ich anders machen, damit das klappt?
>
> Wie oben gezeigt: Die Definition von convert ändern.

Vielen Dank! Funktioniert nun einwandfrei...

Gruss
Andreas
0 new messages