Предположим, у меня есть класс 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 ++)