std::find_if() Aufruf von IsOdd aus Klasse
-
Hallo Cummunity,
ich versuche gerade aus einem Vector mit der Funktion 'std::find_if(...)' zu arbeiten.
Dabei stellt sich bei mir die Frage ob ich die 'IsOdd(..)' Funktion in Header der Klasse deklariern kann, damit diese auf Eigenschaften der Klasse zugreifen kann...Hier mal der Code um das etwas zu verdeutlichen:
Die Header-Datei myClass.h:#ifndef __myClass__ #define __myClass__ // Header #include <wx/wx.h> #include <vector> typedef std::pair<unsigned long, wxString> vInlay; typedef std::vector<vInlay> listeStore; class myClass { private: unsigned long searchFor; protected: listeStore liste; // Der Vector public: /* c'tor */ myClass(); // Etwas suchen bool ValueInListeGot(unsigned long toFind); protected: // IsOdd Funktion bool IsOdd(vInlay inlay); }; #endif // __myClass__
Die cpp Datei myClas.cpp
// eigener Header #include "myClass.h" // Header aus Header #include <wx/wx.h> #include <vector> // weitere Header #include <algorithm> /* c'tor */ myClass::myClass() { // VersuchVector mit inhalt befüllen for (unsigned long v=1; v<50; v++) { wxString str; str << _T("Value_") << v; vInlay in(v, str); liste.push_back(in); } } // Etwas suchen bool myClass::ValueInListeGot(unsigned long toFind) { listeStore::iterator itFind; searchFor = toFind; itFind = std::find_if(liste.begin(), liste.end(), IsOdd); // hier wirft er sich mit Fehlermeldung if (itFind != liste.end()) { return true; } return false; } // IsOdd Funktion bool myClass::IsOdd(vInlay inlay) { if (inlay.first == searchFor) return true; return false; }
Wenn ich die 'IsOdd(...)' Klasse nicht in die 'myClass' lege, (und natürlich die 'searchFor' z.B. in einem namespace statisch initalisiere), funktioniert der ganze Spaß.
Die Frage wo sich jetzt hierbei bei mir stellt ist, ist es möglich diese 'IsOdd(...)'-Funktion in myClass zu bekommen.
Habe auch schon Sachen versucht wie:
itFind = std::find_if(liste.begin(), liste.end(), &IsOdd); itFind = std::find_if(liste.begin(), liste.end(), myClass::IsOdd); itFind = std::find_if(liste.begin(), liste.end(), &myClass::IsOdd);
Besten Dank und fröhliches proggen...
Ollow
-
Template Funktionen müssen zur Gänze während der Compile-Zeit des entsprechenden templates bekannt sein. Also die Funktion IsOdd muss mit in der Klasse liegen oder im Header als inline.
Auslagern in CPP Module ist so nicht möglich.
-
Zusätzlich muss die Funktion statisch / global sein, bzw. besser gerade einen Funktor machen.
Simon
-
Besten Dank für schnellen Antworten....
Mfg
Ollow