Pesquisa de ponteiro bruta para conjuntos de unique_ptrs

Muitas vezes me vejo querendo escrever código como este:

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

  void removeObject(const Object* target);

private:
  std::set<std::unique_ptr<Object>> objects;
};

No entanto, grande parte da interface std :: set é inútil com std :: unique_ptrs, pois as funções de pesquisa requerem parâmetros std :: unique_ptr (que eu obviamente não possuo, porque são de propriedade do próprio conjunto).

Eu posso pensar em duas soluções principais para isso.

Crie um unique_ptr temporário para pesquisa. Por exemplo, o removeObject () acima pode ser implementado como:

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

Substitua o conjunto por um mapa de ponteiros brutos para unique_ptrs.

  // ...
  std::map<const Object*, std::unique_ptr<Object>> objects;
};

No entanto, ambos parecem um pouco estúpidos para mim. Na solução 1, erase () não é uma exceção, portanto, o unique_ptr temporário pode excluir o objeto que realmente não possui e 2 requer o dobro do armazenamento para o contêiner desnecessariamente.

Eu sei sobre os contêineres de ponteiro do Boost, mas seus recursos atuais são limitados em comparação com os modernos contêineres de biblioteca padrão do C ++ 11.

Eu estava lendo recentemente sobre o C ++ 14 e me deparei com "Adicionando pesquisa de comparação heterogênea a contêineres associativos". Mas para formar minha compreensão, os tipos de pesquisa devem ser comparáveis ​​aos tipos de chave, mas os ponteiros não são comparáveis ​​a unique_ptrs.

Alguém sabe de uma solução mais elegante ou uma adição futura ao C ++ que resolve este problema?

questionAnswers(6)

yourAnswerToTheQuestion