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