Seite 1 von 1

Funktionspointer der Basisklasse an boost::bind übergeben

Verfasst: 19.04.2016, 17:02
von Matthias Gubisch

Code: Alles auswählen

class FOO
{
protected:
    virtual void foo();
};

class BAR : publich FOO
{
void doSomething();
protected:
     virtual void foo();
}

void BAR::doSomething()
{
   //somecode
   function(boost::bind(&FOO::foo, this _1));  //compiler error das foo protected ist
   function(boost::bind(&BAR::foo, this _1));  //funktioniert ruf aber die implementierung der abgeleiteten Klasse auf was ich nicht möchte
}

Soweit der Code. Ich möchte an der Stelle allerdings explizit die Implementierung der Basisklasse an boost::bind übergeben. Aber ich komme nicht drauf wie ich das machen muss.

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 20.04.2016, 13:16
von dawit
Könntest du nicht einfach this nach FOO* casten?

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 20.04.2016, 13:26
von Matthias Gubisch
Nein das funktioniert leider nicht :(
Die Compilermeldung bleibt die gleiche

Sonst keiner der ganzen C++ Spezialisten hier eine Idee?

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 20.04.2016, 14:43
von Schrompf
Wüsste nicht, dass das überhaupt geht. Aber ich bin auch nicht so der Standard-Auskenner.

Ich würde es spontan in einen Lambda verpacken. Da müsste man dann die Funktion konkret benennen können, die man aufrufen will.

Code: Alles auswählen

// direkter Aufruf
BAR bar;
bar.FOO::foo();
Das müsste so gehen, wenn ich mich recht erinnere. Du kriegst natürlich trotzdem den Compilerfehler, dass FOO::foo() protected ist, weil das nunmal gar nix mit Ableitungen und nur was mit Zugriffsrechten zu tun hat.

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 20.04.2016, 14:49
von B.G.Michi
Wenn ich das hier richtig interpretiere ist das so direkt nicht möglich -> Wrapperfunktion

Code: Alles auswählen

class BAR : public FOO
{
protected:
    virtual void foo();
    void baseFoo()
    {
        FOO::foo();
    }
    void doSomething()
    {
       function(boost::bind(&BAR::baseFoo, this));
    }
};

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 20.04.2016, 14:58
von Matthias Gubisch
Lambdas kann ich leider nicht benutzten, unterstützt der Compiler hier noch nicht :(

Mit dem Workaround über die Wrapperfunktion habe ich das ganze mittlerweile gelöst. Ist zwar nicht besonders schön aber funktioniert zumindest.

Nachdem es offenbar keine elegantere Möglichkeit gibt werde ich es jezt mal dabei belassen.
Vielen Danke für euere Hilfe

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 21.04.2016, 14:45
von Jonathan
Matthias Gubisch hat geschrieben: Nachdem es offenbar keine elegantere Möglichkeit gibt werde ich es jezt mal dabei belassen.
Ich meine, ist nicht die Problemstellung ansich schon unelegant? Soweit ich das sehe, ist das Hauptproblem, dass die Methode protected ist. Du willst aber ein Funktionsobjekt erstellen, das diese Methode aufruft und an irgendeine Funktion weitergeben, die dadurch dann irgendwie die Methode aufruft, obwohl sie protected ist.

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Verfasst: 21.04.2016, 14:58
von Matthias Gubisch
Jonathan da hast du nicht ganz unrecht, leider kann ich hier nicht die ganze Architektur nach meinen Vorstellungen umgraben. Ist halt historisch gewachsen...

Meine Hoffnung war dass ich das Funktionsobjet erstellen kann da ich beim erstellen ja Zugriff auf die protected Methode habe (ich befinde mich ja in der abgeleiteten Klasse).
Leider gibt es für die unelegante Problemstellung keine elegantere Lösung als die Wrapperfunktion, zumindest nicht ohne C++11 oder neuer.