2016-05-23 20 views
0

Ich möchte eine set<int> als ein Mitglied meiner Klasse zu deklarieren, und ich möchte es einen benutzerdefinierten Komparator geben, der die Klasseninstanz Felder innerhalb davon verwenden wird.C++ setzen Vergleicher mit Member-Felder

Etwas wie folgt aus:

class MyClass { 
    public: 
    MyClass() : my_set(fn_pt) {} 
    std::vector<int> blocks; 
    bool comp(int lhs, int rhs) { 
     return blocks[lhs] < blocks[rhs]; 
    } 
    bool(*fn_pt)(int,int)=comp; 
    std::set<int, bool(*)(int,int)> my_set; 
}; 

dies ein Fehler gibt:

error: cannot convert ‘MyClass::comp’ from type ‘bool (MyClass::)(int, int)’ 
to type ‘bool (*)(int, int)’ 
bool(*fn_pt)(int,int)=comp; 

Wie kann ich es zur Arbeit? Danke

Antwort

3

Als Fehlerzustand MyClass::comp ist bool (MyClass::)(int, int) nicht bool (*)(int, int).

Wie Sie tatsächlich this verwenden, static das Verfahren macht keine Lösung ist, können Sie

std::set<int, std::function<bool(int, int)>> my_set; 

stattdessen tun und dann

MyClass() : my_set([this](int lhs, int rhs) { return blocks[lhs] < blocks[rhs]; }) {} 
+0

Awesome, thanks! Ich habe gerade einen anderen Weg gefunden, das Gleiche zu tun (ähnliche Idee, aber mit einer Struktur): http://stackoverflow.com/questions/27467980/how-to-define-a-stdset-sorting-on-another-class- data-member? rq = 1 –

+1

Die Wertesemantik dieser Klasse wird mit einem solchen Setup gebrochen. –

+0

@BenjaminLindley Können Sie bitte erarbeiten, verstehe ich nicht. Welche Alternative würdest du vorschlagen? Danke –