2011-06-15 9 views
8

¿Se considera en general una mala práctica de utilizar typeid en el código de producción? Además, noté que typeid devuelve type_info, que incluye algunos metadatos (como una cadena con el nombre del tipo); ¿Hay alguna forma de desactivar esto?C++: Usando typeid en el código de producción

+3

Probablemente no desee devolver las referencias 'typeid' de una llamada a la biblioteca. Será mejor que escriba una función para convertir un 'typeid' a otra cosa, como un' int', donde controla la asignación. Además, no hay garantía de que 'typeid' permanezca igual desde la versión del compilador hasta la versión. Esto también significa que no desea almacenar 'typeid' en el disco, excepto tal vez en un archivo de caché que no se conserva entre ejecuciones. –

Respuesta

8

Es difícil decir si el uso de una función de idioma en particular es "mala" o "buena". Realmente depende de cómo lo uses. No hay nada inherentemente malo en usar typeid si es la herramienta adecuada para el trabajo, pero si hay una mejor solución a cualquier problema que se está resolviendo, entonces usted debe evitar el uso de typeid a favor de que una mejor solución.

A menudo no es una buena idea usar typeid porque a menudo se puede evitar su uso mediante el uso de funciones virtuales y de herencia. Si puede actualizar su sistema de esta manera, entonces podría ser una buena idea hacerlo.

En cuanto a si puede tener typeid evite devolver std::type_info, esto no debería causar ningún problema de rendimiento. typeid se evalúa como const std::type_info&, por lo que no copia en profundidad ninguna de las cadenas de información que contiene. La mayoría de las implementaciones tienen el objeto real std::type_info almacenado en la tabla de funciones virtuales del objeto, por lo que no se realiza ninguna copia interna.

11
  1. Depende de lo que esté haciendo con el typeid. Si estás usando el lugar donde deberías usar el polimorfismo, entonces eso es malo. Sin embargo, eliminar las huellas o cosas así para depurar en las máquinas de los clientes está bien.
  2. La única forma es deshabilitar RTTI en su compilador. No hay una forma estándar de hacerlo. Tenga en cuenta que esto también deshabilitará dynamic_cast.
Cuestiones relacionadas