was ist ein member pointer genau? und wozu braucht man ihn?



  • nur vorweg: nein, ich mein keine Methodpointer 😉

    also, ich hab das jetzt schon an mehreren stellen gesehen, dass in einem template so ein typ verwendet wird:
    template<class T,class C>
    struct Foo<T C::*>{...};

    hab danach jetzt schon mehrere male erfolglos gegooglet, da die meisten seiten methodpointer mit member pointern gleichgesetzt haben, was aber falsch ist (soviel hab ich jetzt herausgefunden). die forensuche hat auch nichts gebracht...

    dann hab ich selber was rumexperimentiert,wie gesagt, ohne sinn und verstand, und hab jetzt ne lauffähige version die irgendetwas macht, aber was genau, das weis ich nicht :D.

    struct A{
        int foo;
    };
    
    A bar;
    bar.foo=5;
    cout<<bar.foo;//ausgabe 5, was ein wunder
    
    typedef int A::* type;
    type MP=&A::foo;
    a.*MP=10;
    cout<<a.foo;//ausgabe 10
    

    Ist die verwendung so richtig? Wenn ja,wozu braucht man sowas? ist es nur dazu da, damit man sich fragt, was es für eine bedeutung hat? oder ist es nur da um die pointer verwirrung komplett zu machen? "so, die method pointer sind fertig...ach ich hab zeit, bau ich nochmal die member pointer in die Sprache ein,die compilerbauer werden sich freuen" 🤡



  • weis dazu niemand was?



  • Hast du "Die C++ Programmiersprache"?

    Dies wird dort im Kapitel 15.5 erklärt.



  • Ponto schrieb:

    Hast du "Die C++ Programmiersprache"?

    Dies wird dort im Kapitel 15.5 erklärt.

    Nein, das wird dort nicht erklaert, wo man es sinnvoll anwenden kann. Es wird
    nur kurz in C.12 angesprochen, wie man es anwendet. In 15.5 geht es um
    Memberfunktionen.

    mfg
    v R



  • otze schrieb:

    weis dazu niemand was?

    Ich verstehe die Frage ehrlich gesagt nicht. Memberzeiger sind Zeiger auf Member. Genau wie Methodenzeiger können Memberzeiger immer nur im Zusammenhang mit einem passenden Objekt benutzt werden.
    Genau wie Methodenzeigern bieten Memberzeiger eine Indirektion und damit Flexibilität. Statt eine konkrete Methode/ein konkretes Attribut zu benennen reicht die Benennung des gewünschten Typs.

    template <class T, class M>
    struct CmpMember
    {
        typedef M T::*member;
        CmpMember(member m) : m_(m) {}
        bool operator()(const T& o1, const T& o2) const 
        {
             return o1.*m_ < o2.*m_;
        }
    private:
        member m_;
    };
    #include <set>
    #include <string>
    struct Person
    {
        int id_;
        std::string name_;
    };
    int main()
    {
        typedef CmpMember<Person, int> CmpInt;
        typedef CmpMember<Person, std::string> CmpStr;
        std::set<Person, CmpInt> s1((CmpInt(&Person::id_)));
        std::set<Person, CmpStr> s2((CmpStr(&Person::name_)));       
    }
    

Anmelden zum Antworten