Поиск необработанных указателей для наборов unique_ptrs

Мне часто хочется написать код, подобный этому:

class MyClass
{
public:
  void addObject(std::unique_ptr<Object>&& newObject);

  void removeObject(const Object* target);

private:
  std::set<std::unique_ptr<Object>> objects;
};

Однако большая часть интерфейса std :: set бесполезна с std :: unique_ptrs, поскольку функции поиска требуют параметров std :: unique_ptr (которых у меня, очевидно, нет, поскольку они принадлежат самому набору).

Я могу придумать два основных решения этого.

Создайте временный unique_ptr для поиска. Например, вышеупомянутый метод removeObject () может быть реализован следующим образом:

void MyClass::removeObject(const Object* target)
{
  std::unique_ptr<Object> targetSmartPtr(target);
  objects.erase(targetSmartPtr);
  targetSmartPtr.release();
}

Замените набор картой необработанных указателей на unique_ptrs.

  // ...
  std::map<const Object*, std::unique_ptr<Object>> objects;
};

Тем не менее, оба кажутся мне немного глупыми. В решении 1 erase () не исключение, поэтому временный unique_ptr может удалить объект, который ему не принадлежит, и 2 излишне требует двойного хранилища для контейнера.

Я знаю о контейнерах указателей Boost, но их текущие возможности ограничены по сравнению с современными стандартными контейнерами C ++ 11.

Недавно я читал о C ++ 14 и наткнулся на «Добавление поиска гетерогенного сравнения в ассоциативные контейнеры». Но, насколько я понимаю, типы поиска должны быть сопоставимы с типами ключей, но необработанные указатели не сопоставимы с unique_ptrs.

Кто-нибудь знает более элегантное решение или грядущее дополнение к C ++, которое решает эту проблему?

Ответы на вопрос(6)

Ваш ответ на вопрос