¿Hay alguna razón por la cual se especifique que std::type_info
es polimórfico? El destructor se especifica como virtual (y hay un comentario sobre el efecto de "para que sea polimórfico" en The Design and Evolution of C++). Realmente no puedo ver una razón convincente por qué. No tengo ningún caso de uso específico, solo me preguntaba si alguna vez hubo un razonamiento o historia detrás de esto.¿Por qué std :: type_info polymorphic?
Aquí hay algunas ideas que yo he llegado con y rechazado:
- Es un punto de extensibilidad - implementaciones podrían definir subclases, y programas podría luego tratar de
dynamic_cast
unstd::type_info
a otro, implementación- tipo derivado definido. Esta es posiblemente la razón, pero parece que es tan fácil para las implementaciones agregar un miembro definido por la implementación, que posiblemente sea virtual. Los programas que deseen probar estas extensiones necesariamente no serán portátiles de todos modos. - Es para asegurar que los tipos derivados se destruyan correctamente cuando
delete
ing un puntero base. Pero no hay tipos derivados estándar, los usuarios no pueden definir tipos derivados útiles, porquetype_info
no tiene constructores públicos estándar, por lo quedelete
en un punterotype_info
nunca es legal y portátil. Y los tipos derivados no son útiles porque no se pueden construir; el único uso que conozco para tales tipos derivados no construibles se encuentra en la implementación de elementos como el rasgo de tipois_polymorphic
. - Deja abierta la posibilidad de metaclases con tipos personalizados: cada polimórfica real
class A
obtendría una "metaclase" derivadaA__type_info
, que deriva detype_info
. Tal vez tales clases derivadas podrían exponer a los miembros que llaman alnew A
con varios argumentos de constructor de una manera segura para tipos, y cosas por el estilo. Pero hacer quetype_info
sea polimórfico hace que tal idea sea básicamente imposible de implementar, porque tendrías que tener metaclases para tus metaclases, ad infinitum, que es un problema si todos los objetostype_info
tienen una duración de almacenamiento estática. Quizás excluir esto es la razón para hacerlo polimórfico. - Se puede utilizar RTTI características (que no sean
dynamic_cast
) astd::type_info
sí mismo, o alguien pensó que era lindo, o embarazoso sitype_info
no era polimórfico. Pero dado que no hay un tipo derivado estándar, y no hay otras clases en la jerarquía estándar a las que razonablemente se pueda probar con cross-cast, la pregunta es: ¿qué? ¿Hay algún uso para expresiones comotypeid(std::type_info) == typeid(typeid(A))
? - Es porque los implementadores crearán su propio tipo derivado privado (como creo que lo hace GCC). Pero, ¿por qué molestarse en especificarlo? Incluso si el destructor no se especificó como virtual y un implementador decidió que debería serlo, seguramente esa implementación podría declararlo virtual, porque no cambia el conjunto de operaciones permitidas en
type_info
, por lo que un programa portátil no podría para ver la diferencia - Tiene que ver con compiladores con incompatibilidades ABI parcialmente compatibles, posiblemente como resultado de la vinculación dinámica. Quizás los implementadores podrían reconocer su propia subclase
type_info
(a diferencia de una que se origina en otro proveedor) de forma portátil si se garantizara quetype_info
sería virtual.
El último es el más plausible para mí en este momento, pero es bastante débil.
Sí, entiendo eso, pero no puedo ver nada portátil que pueda hacer con la información de que es una subclase, o no. Parece que todos los programas portátiles y válidos ahora seguirían siendo válidos si no fueran polimórficos. Hacerlo para que no pueda detectar necesariamente las subclases (al hacer que type_info no sea polimórfico) no debería cambiar nada para los programas portátiles, hasta donde puedo ver, y no debería hacer las extensiones no portátiles más difíciles de crear. ¿Puedes pensar en un contraejemplo de algo hecho posible por esta especificación? – Doug
@Doug: mira mi edición –
Gracias, pero todavía no entiendo por qué esa última expresión requiere 'type_info' para ser polimórfica. Todas las funciones útiles en 'type_info', como' operator == ',' before', 'name', etc. no se especifican como virtuales. Entonces, si una implementación necesita despacho virtual en esas funciones, entonces supongo que puede declararlas virtuales, o delegarlas en funciones de implementación virtuales, y si no es así, entonces no es necesario que sean virtuales. ¿Se me escapa algo? – Doug