Использовать общий указатель
Вы можете использовать тип общего указателя владения. То есть просто используйте вместо std::shared_ptr
. У этого не будет той же самой проблемы вообще. Код выглядит почти так же, как и раньше:
bool foo(std::shared_ptr<SchedulerTask> task)
{
eventList_.push(task);
return task == eventList_.top();
}
Использование прокси с идентификатором
Ваша проблема в основном такова: как только вы перемещаете уникальный указатель в контейнер, вы больше не можете его идентифицировать , Следовательно, другое решение может быть , чтобы придерживаться std::unique_ptr
, но добавить механизм уникальной идентификации. Это может быть объект прокси-типа:
struct SchedulerTaskInfo {
std::unique_ptr<SchedulerTask> task_;
int id_;
};
Теперь вы можете сравнить, используя id_
:
bool foo(SchedulerTaskInfo task)
{
eventList_.push(std::move(task));
return task.id_ == eventList_.top().id_;
}
Вы можете даже создать operator==
на прокси, если Вы хотели.