Использование unordered_map, где Key является членом T

Есть ли хороший способ использовать unordered_map, чтобы вы могли получать доступ к объектам с помощью переменной-члена в постоянное время (средний случай)? В следующем примере есть эта функция, но требуется, чтобы имя каждого Person дублировалось в качестве ключа:

#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>

class Person {
 public:
  Person() : name_("") {}
  Person(const std::string& name) : name_(name) {}
  std::string getName() const { return name_; }
  void kill() const { std::cout << name_ << " is dead!" << std::endl; }
 private:
  std::string name_;
};

int main(int argc, const char* argv[]) {
  Person p1("dave");
  Person p2("bob");

  std::unordered_map<std::string, Person> map = {
    {p1.getName(), p1}, // Duplicating the
    {p2.getName(), p2}  // keys here
  };

  map["dave"].kill();
  return 0;
}

Я думаю, что каким-то образом value_type должен быть Сам человек вместо пары и unordered_map должен знать, что использовать Person :: getName при хешировании и доступе объекты.

Идеальное решение позволило бы мне настроить unordered_map (или unordered_set , если он более подходит для работы), который знает, как использовать Person :: getName , чтобы получить ключ каждого объекта. Затем я мог бы вставить их, просто указав объект (и не имея ключа, потому что он знает, как получить ключ), и получить к ним доступ, указав ключи, которые будут сравниваться с возвращаемым значением Person :: getName .

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

// Pseudocode
std::unordered_map<Person, Person::getName> map = {p1, p2};
map["dave"].kill();

Итак, можно ли создать экземпляр класса шаблона unordered_map , который может делать это аккуратно?

5
задан ildjarn 16 November 2011 в 19:44
поделиться