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

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

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

  void removeObject(const Object* target);

private:
  std::set objects;
};

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

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

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

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

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

  // ...
  std::map objects;
};

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

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

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

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

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

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