Existiert ein sinnvoller Anwendungsfall für .* und ->* Operatoren?



  • Mir ist beim durchsehen der Operatorenliste aufgefallen das ich die Operatoren .* und ->* praktisch nie verwendet habe. Bei der Konstruktion die man damit bauen kann fällt mir allerdings auch kein Anwendungsfall ein wo ich sagen würde das wäre die Lösung. Daher meine Frage, existiert überhaupt ein Anwendungsfall bei dem man genau dieses Verhalten/diese Konstruktion benötigt?



  • Sinnvoll ist relativ, aber ja.



  • Methodenzeiger?!


  • Mod

    Die Frage sollte eher lauten, wann man mal Zeiger auf Member braucht. Das kommt alle paar Jahre mal vor. Und wenn es vorkommt, dann braucht man diese Operatoren.



  • Skym0sh0 schrieb:

    Methodenzeiger?!

    Ja schon, aber mir kommt auch dafür kein wirklicher Anwendungsfall in den Sinn wo ich genau das brauchen würde.

    Ich gehe mal davon aus das das ganze auf Fälle hinausläuft die man auch auf anderem Wege gut lösen kann?


  • Mod

    Xebov schrieb:

    Ich gehe mal davon aus das das ganze auf Fälle hinausläuft die man auch auf anderem Wege gut lösen kann?

    Eigentlich nicht. Wenn man Methodenzeiger braucht, dann braucht man Methodenzeiger. Aber die Anwendungen für die Operatoren .* und ->* sind versteckt im Hintergrund, daher siehst du sie nie, beispielsweise in std::bind. Das ist dann auch ein gutes Beispiel, falls es mal jemanden in den Fingern juckt, die Standardbibliothek nachzuprogrammieren:

    #include <iostream>
    
    template<typename Object, typename Member_ptr> class seppjs_schlechter_bind_abklatsch
    {
      Object &object;
      Member_ptr ptr;
    public:
      seppjs_schlechter_bind_abklatsch(Object &object, Member_ptr ptr): object(object), ptr(ptr) {}
      auto operator()() -> decltype((object.*ptr)()) { return (object.*ptr)(); }  // Der ersehnte Anwendungsfall!
    };
    
    template<typename Obj, typename Ptr> seppjs_schlechter_bind_abklatsch<Obj, Ptr> 
    seppjs_bind(Obj &obj, Ptr ptr) { return {obj, ptr}; }
    
    struct Foo
    {
      int i;
      void bar() { std::cout << i << '\n'; }
    };
    
    template <typename Callback> void caller(Callback callback)
    {
      callback();
    }
    
    int main()
    {
      Foo foo{5};
      caller(seppjs_bind(foo, &Foo::bar));
    }
    


  • Danke.


Anmelden zum Antworten