или О Нарушенных Обещаниях.
Добрейшего всем.
У меня есть вектор элементов кастомного класса Item, которые надо сортировать двумя способами: по размеру и по хэшу.
Для этого я делаю два соответствующих геттера:
long getSize() const;
unsigned char* getHash();
[UPD]
Хэши хранятся в объектах, getHash() изменяет значение соответствующего приватного члена
[/UPD]
Дальше пишется функтор с параметром field, принимающим значение SIZE или HASH
struct cmpItem
bool operator() ( const Item& left, const Item& right)
if ( field == SIZE ) return left.getSize() < right.getSize();
/* if ( field == HASH ) return left.getHash() < right.getHash(); */
Сортировка вектора по размеру
std::vector<Item> scroll;
...
std::sort( scroll.begin(), scroll.end(), cmpItem(SIZE) );
Если раскомментить в функторе
if ( field == HASH ) return left.getHash() < right.getHash();
passing ‘const Item’ as ‘this’ argument of ‘unsigned char* Item::getHash()’ discards qualifiers
что логично, ибо этот метод не костантный.
Если привести getSize() к аналогичному getHash() виду (без const)
long getSize();
bool operator() ( Item& left, Item& right)
no match for call to ‘(cmpItem) (Item&, const Item&)’
no match for call to ‘(cmpItem) (const Item&, Item&)’
У меня такие вызовы не используются, это желание компилятора «шоб було»?
Нельзя иметь один функтор для неизменяющего метода и изменяющего метода?
Если я должен оба метода сделать не константными, то как?