Поиск необработанных указателей для наборов 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 ++, которое решает эту проблему?