Relative Pointer auf Klassenmitglieder



  • Kann mir jemand eine Praktischen einsatz von "Relative Pointer auf Klassenmitglieder" schreiben, zeigen [...] ?

    🙂
    mfg Fragender



  • #include <algorithm>
    #include <functional>
    #inlcude <iterator>
    #include <iostream>
    #include <string>
    using namespace std;
    
    #define for if(0);else for
    const char newl = '\n'; 
    
    struct Buch
    {
        Buch(const string & titel_, const string & autor_, const string & isbn_)
         :titel(titel_), autor(autor_), isbn(isbn_)
        {}
        string titel;
        string autor;
        string isbn;
    };
    
    ostream & operator<< (ostream & os, const Buch & buch)
    {
        const char newl = '\n'; 
        const char tab  = '\t';
        os << "<Buch>" << newl;
        os << tab << "<titel>" << buch.titel << "</titel>" << newl;
        os << tab << "<autor>" << buch.autor << "</autor>" << newl;
        os << tab << "<isbn>"  << buch.isbn  << "</isbn>"  << newl;
        os << "</Buch>" << newl;
        return os;
    }
    
    namespace PODTools
    {
        template
        <
            typename TofStruct, 
            typename TofMember, 
            typename Predicate
        >
        class Member_t : public binary_function<TofStruct, TofStruct, bool>
        {
        public:
            typedef TofMember (TofStruct::*MemberPtr);
    
            Member_t(MemberPtr pMember, Predicate pred)
             :  m_pMember(pMember), 
                m_pred(pred)
            {
            }
    
            bool operator() (const TofStruct & lhs, const TofStruct & rhs) const
            {
                return m_pred( lhs.*m_pMember, rhs.*m_pMember );
            }
    
        private:
            MemberPtr   m_pMember;
            Predicate   m_pred;
        };
    
        template<typename TofStruct, typename TofMember, typename Predicate>
        Member_t<TofStruct, TofMember, Predicate> Member(TofMember (TofStruct::*pMember), Predicate pred)
        {
            return Member_t<TofStruct, TofMember, Predicate>( pMember, pred );
        }
    
    }
    
    int main()
    {
        Buch Buecher[] = 
        { 
            Buch( "OOP für Dummies",            "Marcus Bäckmann",      "3826629841" ), 
            Buch( "Effektiv C++ programmieren", "Scott Meyers",         "3827313058" ), 
            Buch( "Die C++-Programmiersprache", "Bjarne Stroustrup",    "382731660X" ), 
            Buch( "Entwurfsmuster",             "GoF",                  "3827318629" ),
            Buch( "Algorithmen in C++ ",        "Robert Sedgewick",     "3893194622" ),
            Buch( "C++ Ent- Packt",             "Herbert Schildt",      "3826607317" ),
            Buch( "Exceptional C++",            "Herb Sutter",          "3827317118" ),
            Buch( "Modern C++ Design",          "A. Alexandrescu",      "0201704315" ),
            Buch( "Effective STL",              "Scott Meyers",         "0201749629" )
        };
    
        Buch * const BuecherBegin  = Buecher;
        Buch * const BuecherEnd    = Buecher + sizeof(Buecher) / sizeof(Buecher[0]);
    
        sort( BuecherBegin, BuecherEnd, PODTools::Member( &Buch::titel, less<string>() ) ); //heute sortiere ich mal nach titeln
    
        copy( BuecherBegin, BuecherEnd, ostream_iterator<Buch>( cout, "\n" ) );
    
        Buch * const f = find_if( BuecherBegin, BuecherEnd, bind1st( PODTools::Member( &Buch::autor, equal_to<string>() ), "Scott Meyers" ) );
        if(f != BuecherEnd)
            cout << *f << endl;
    }
    

    ahja der name Member und member_t sind unpassend

    [ Dieser Beitrag wurde am 01.05.2003 um 14:52 Uhr von Dimah editiert. ]


Anmelden zum Antworten