2016-05-23 7 views
0

Я хотел бы объявить set<int> как член моего класса, и я хочу дать ему пользовательский компаратор, который будет использовать поля экземпляра класса внутри него.C++ set compator using поля пользователя

Что-то вроде этого:

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; 
}; 

Это дает ошибку:

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

Как я могу заставить его работать? СООБЩЕНИЕ

ответ

3

По состоянию на MyClass::comp является bool (MyClass::)(int, int) не bool (*)(int, int).

Как вы на самом деле использовать this, что делает метод static не является решением проблемы, вы можете вместо этого сделать

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

, а затем

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

Awesome, спасибо! Я только что нашел другой способ сделать то же самое (аналогичная идея, но используя структуру): http://stackoverflow.com/questions/27467980/how-to-define-a-stdset-sorting-on-another-class- data-member? rq = 1 –

+1

Семантика значения этого класса разбивается на такую ​​установку. –

+0

@BenjaminLindley Не могли бы вы рассказать, я не понимаю. Какую альтернативу вы бы предложили? Спасибо –