remove_if: Alle Elemente löschen die != elem.GetSth() sind?



  • Der Fehler ist der operator() (T elem)
    T wird durch int ersetzt, Du willst aber TRMode haben.

    Mach doch:

    template <class T, class X>
    struct not_equal_to_member
    {
        // Typen
        typedef T (X::*MethodPointer) () const;
    
        // Aufzurufende Vergleichsmethode
        private:
          MethodPointer mMethod;
        // Vergleichswert
           T mValue;
    
        // Konstruktoren
        public:
        not_equal_to_member (MethodPointer method, T value)
            :
        mMethod(method),
        mValue(value)
        {
        }
    
        // Operatoren
        bool operator() (X elem) const  // hier darf nicht T stehen
        {
            return mValue != (elem.*mMethod)();
        }
    };
    

    Damit kannst Du das Prädikat dann auch für andere Typen als TRMode einsetzen.



  • Hast recht, wäre aber offenbar nur ein Folgefehler gewesen. Er meckert ja beim Konstrukturaufruf und der hat mit dem op() noch nichts zu tun. Es funktioniert trotz der Richtigstellung immer noch nicht 😞

    /Edit: Hab hier mal einstweilen Boost installiert, mit Boost ists kein Problem. Bloß verstehe ich die Implementierung von denen nicht und direkt einsetzen kann ichs auhc nicht.

    MfG SideWinder



  • Folgender kleiner Test compiliert hier und liefert ein korrektes Ergebnis:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Elem
    {
        int member;
    
        public:
            Elem( int y) : member( y) {};
            int GetMember () const { return member; }
    };
    
    template <class T, class X>
    struct not_equal_to_member
    {
        // Typen
        typedef T (X::*MethodPointer) () const;
    
        // Aufzurufende Vergleichsmethode
        private:
          MethodPointer mMethod;
        // Vergleichswert
           T mValue;
    
        // Konstruktoren
        public:
        not_equal_to_member (MethodPointer method, T value)
            :
        mMethod(method),
        mValue(value)
        {
        }
    
        // Operatoren
        bool operator() (X elem) const
        {
            return mValue != (elem.*mMethod)();
        }
    };
    
    int main()
    {
       vector<Elem> x;
       x.push_back( Elem( 1));
       x.push_back( Elem( 0));
       x.push_back( Elem( 2));
       x.push_back( Elem( 0));
       x.push_back( Elem( 3));
       for( int i = 0; i < 10; ++i) { x.push_back( Elem( i)); }
    
       int value = 0;
    
       vector<Elem>::iterator eraseFrom = 
         std::remove_if(x.begin(),x.end(),
                        not_equal_to_member<int, Elem>(&Elem::GetMember,value));
    
       x.erase(eraseFrom,x.end());
    
       for( vector<Elem>::const_iterator it = x.begin(); it != x.end(); ++it) {
       	cout << it->GetMember() << " ";
       }
       cout << endl;
    }
    

    Compiler ist irgendeine neuere GCC Version für Windows.



  • Nachtrag: Mit MSVC 7.1 geht's auch.



  • VERDAMMT VERDAMMT VERDAMMT VERDAMMT VERDAMMT VERDAMMT ICH SCHIESS SIE ALLE AB 😡

    Weil den Kerlen das TEXT()-Macro für hardcoded Unicode-Externalisierungen zu lang war haben die:

    #define T TEXT
    

    eingeführt. Ich mein wie kann man den Standard-Template-Parametr fast aller Template-Klassen im Umlauf nur umdefinieren? Ich sitz verdammte 11 Stunden vor dem PC und jetzt erst wundert mich in der Template-Fehlermeldung dieses TEXT als Paramter, das wird doch sonst nie gemacht. Und dann bimmelts, ich will heulen 😞

    MfG SideWinder



  • hey sidewinder warum wird denn in deiner firma makros für public und private benutzt? oder steckt da mehr hinter als

    #define PRIVATE private
    #define PUBLIC public

    😕



  • Keine Ahnung, sowas kann ich in meiner Stellung nicht hinterfragen. In 3 Wochen heißts für mich wieder ab in die Schule und die bekommen die Sourcen soweit ich gekommen bin.

    MfG SideWinder



  • lol man muss doch immer genau wissen was man tut und warum man etwas tut. 🤡



  • vielleicht alte java-hasen die mit C-makros C++ spielen wollen *hüstel*



  • Ist doch super praktisch wenn sich die keywords mal im Namen ändern.


Anmelden zum Antworten