Есть ли способ вызывать неконстантные методы на (unordered_) множестве объектов, которые сравниваются равными только на основании одного из своих (const) членов? - PullRequest
0 голосов
/ 25 апреля 2020

Предположим, у меня есть класс Person, подобный этому:

class Person {
    const int id;
    std::string name;
    std::string email;
    ... //bunch of non-const fields and methods that don't modify id

    bool operator(const Person& p) const {
        return id == p.id;
    }
}

namespace std {
    template<>
    struct hash<Person>
    {
        size_t operator()(const Person& p) const 
        {
            return hash<size_t>()(p.id);
        }
    };
}

Если бы я теперь оставил unordered_set of Persons (например, std::unordered_set<Person> persons;), и я бы использовал std::find, чтобы найти спецификацию c Человек в этом наборе вернул бы мне итератор, который я не могу использовать для изменения объекта, на который он указывает, конечно, поскольку в отношении компилятора любой неконстантный метод, который я вызываю для этого объекта, может изменить id такое, что хэши нужно пересчитать et c. Помимо того, что id является константным, поэтому даже неконстантный метод не может его изменить, я понимаю, что компилятор может не знать о специфике того, что я использую в своих пользовательских методах хэширования и равенства. Однако, чтобы изменить все методы, которые я sh должен вызывать для объектов Person из такого итератора, чтобы они стали константными, требуется, чтобы все члены, измененные в этих методах mutable, и все методы, вызываемые в этих методах const, даже компилировались. Это не похоже на способ, которым mutable предназначался для использования в первую очередь, но я думаю, вы могли бы сказать, что все методы Person, которые не изменяют id, семантически const в способ, которым они не изменяют «сущность» Человека, поскольку они не изменяют id.

Есть ли другой способ, который не требует, чтобы я пометил почти все элементы mutable и каждый метод const, в то же время позволяя мне использовать unordered_set, чтобы быстро находить людей на основе их id?

(я знаю, что мог бы также использовать unordered_map с id в качестве ключа и Person в качестве значения, но я предполагаю, что этот вопрос действительно о том, что семантически является ключевым словом const значит в C ++)

...