Según cppreference.com, std::shared_ptr
proporciona un conjunto completo de operadores relativos (==,! =, <, ...), pero la semántica de la comparación no se especifica. Supongo que comparan los punteros crudos subyacentes con los objetos a los que se hace referencia, y que std :: weak_ptr y std :: unique_ptr hacen lo mismo.¿Está bien heredar de los punteros inteligentes C++ 11 y anular los operadores relativos?
Para algunos propósitos, preferiría tener operadores relativos que pidan los punteros inteligentes basados en la comparación de los objetos referenciados (en lugar de los punteros a ellos). Esto ya es algo que hago mucho, pero con mis propios "consejos tontos" que se comportan principalmente como indicadores crudos, excepto para los operadores relativos. Me gustaría hacer lo mismo con los punteros inteligentes estándar C++ 11 también. Así que ...
¿Está bien que heredar de los C++ 11 punteros inteligentes (shared_ptr, weak_ptr y unique_ptr) y anular los operadores relativos?
¿Hay algún problema furtivo que deba tener en cuenta? Por ejemplo, ¿hay algún otro método que necesite implementar o usar
using
para garantizar que todo funcione correctamente?Para lo último en pereza, ¿hay una plantilla de biblioteca disponible que haga esto automáticamente?
Espero que este sea un "¡por supuesto que puedes hacer eso, idiota!" tipo de cosas, pero estoy un poco inseguro porque hay algunas clases en la biblioteca estándar (contenedores como std::map
al menos) que se supone que no debe heredar.
En general, no es seguro heredar de algo que destructor no sea dinámico. Puede ser y se hace comúnmente, solo tienes que ser muy cuidadoso. –
@Mooing Duck - OK, no hay enlace tardío, lo que podría ser un problema para el destructor y en cualquier otro lugar - tiene sentido. No creo que esto sea un problema para mí, al menos en este momento, pero tendré que verificarlo. Tal vez sería mejor incluir un puntero inteligente como miembro en lugar de heredarlo. – Steve314
Er, por "dinámico", por supuesto, quiero decir "virtual" –