std :: shared_ptr с контейнерами std - PullRequest
4 голосов
/ 08 марта 2011

У меня есть контейнер shared_ptr s, и я передаю эти объекты в Windows API, и позже я получаю обратный вызов с необработанным ptr.Я хочу найти право shared_ptr по факту.Можно ли это сделать с shared_ptr чисто?(без использования shared_from_this()).

очень простой пример:

class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;

extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
  m_gSet.erase(pRawPtr);
}

Я знаю, что это можно сделать с помощью intrusive_ptr очень легко, но мне интересно, если есть способ сshared_ptr.Ака Я ищу контейнер, чтобы принять RawPtr и shared_ptr для поиска элемента shared_ptr.Проблема в том, что я не могу неявным образом привести CFoo* в shared_ptr (по причинам, которые я понимаю).

Я думал, что смогу сделать

m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))

но я еще не пробовал, и это кажется опасным / уродливым.Есть другой способ или я в основном ищу intrusive_ptr?Спасибо

1 Ответ

2 голосов
/ 08 марта 2011

Почему не очевидный путь? Выполните итерацию через контейнер и

if(iterator->get() == rawPointer)
   container.erase(iterator)

Редактировать: Чтобы использовать поиск O (logN), вы можете делать то, что вы хотите (то есть создать shared_ptr с удалением no_op). Это может быть некрасиво, но не опасно

...