adresse einer virtuellen memberfunktion als template-parameter für einen member



  • Pyr0kar schrieb:

    Das ist mir als Programmierer den überflüssigen this-Zeiger etc. wert.

    Auch den Laufzeitnachteil, der entsteht, weil die Funktion nicht inline generiert werden kann, da auf sie über einen Zeiger zugegriffen wird?

    Eine eher unschöne, aber saubere Lösung dürfte übrigens folgendes sein:

    template <class T, void (T::*F) (void)>
    	struct foo
    {};
    
    struct bar
    {
    	virtual void func (void) { }
    
    private:
    	void func_wrapper (void) { func (); }
    
    public:
    	foo <bar, &bar::func_wrapper> blub;
    };
    

  • Mod

    audacia schrieb:

    Eine eher unschöne, aber saubere Lösung dürfte übrigens folgendes sein:

    unschön, weil du public und private falsch gesetzt hast 😉 virtuelle Funktionen sollten sowieso nicht public sein.



  • camper schrieb:

    virtuelle Funktionen sollten sowieso nicht public sein.

    ??



  • audacia schrieb:

    camper schrieb:

    virtuelle Funktionen sollten sowieso nicht public sein.

    ??

    schließ mich an
    Wieso das denn? Ich hab die immer mit dem Sichtbarkeitsattribut versehen, was ich brauchte - auch public ...



  • *push*



  • @audacia:

    camper schrieb:

    virtuelle Funktionen sollten sowieso nicht public sein.

    Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist. Aber camper sagt "sollten sowieso", als ob du sie public hättest. Gehe mal deswegen davon aus das es nur ein vertipper war 😉

    Private virtuals machen nämlich nicht gerade viel Sinn ...



  • KasF schrieb:

    @audacia:

    camper schrieb:

    virtuelle Funktionen sollten sowieso nicht public sein.

    Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist. Aber camper sagt "sollten sowieso", als ob du sie public hättest. Gehe mal deswegen davon aus das es nur ein vertipper war 😉

    Würde ich nicht von ausgehen 😃

    Private virtuals machen nämlich nicht gerade viel Sinn ...

    In einem der Effectives steht was dazu drin. In der Tat machen private virtuals, die von public nonvirtuals aufgerufen werden, sehr viel Sinn.
    EDIT: Herby schreibt folgendes: http://www.gotw.ca/publications/mill18.htm



  • LordJaxom schrieb:

    Private virtuals machen nämlich nicht gerade viel Sinn ...

    In einem der Effectives steht was dazu drin. In der Tat machen private virtuals, die von public nonvirtuals aufgerufen werden, sehr viel Sinn.
    EDIT: Herby schreibt folgendes: http://www.gotw.ca/publications/mill18.htm

    Achso ok. Ich lese mir das mal später bzw. im Buch nochmal durch, wenn ich *wacher* bin 🙂



  • KasF schrieb:

    Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist.

    virtual void func() ist public!

    @LordJaxom: danke für den Link, das dürfte camper wohl gemeint haben.
    Zwar kann ich ihn verstehen, aber ich teile Sutters Ansichten in dieser Frage nicht generell. In diesem Fall wäre es aber wohl besser, wie camper vorschlägt:

    template <class T, void (T::*F) (void)>
        struct foo
    {};
    
    struct bar
    {
    private:
        virtual void func_impl (void) { }
    
    public:
        void func (void) { func_impl (); }
    
    public:
        foo <bar, &bar::func> blub;
    };
    


  • audacia schrieb:

    KasF schrieb:

    Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist.

    virtual void func() ist public!

    Uuups, da steht ja struct. Sry 🙂


Anmelden zum Antworten