2010-03-01 15 views
14

que he hecho lo suficiente buscar en Google para saber que si tengo algo comoObtención de referencias a shared_ptr aparecen en los diagramas de colaboración doxygen

class SubObject { 

public: 
//blah blah blah 
}; 

class Aggregate { 
public: 
    boost::shared_ptr<SubObject> m_ptr; 
}; 

puedo conseguir Doxygen para crear el diagrama de colaboración "correcta" si tengo una declaración ficticia como

namespace boost { template<class T> class shared_ptr { T *dummy; }; } 

en mi archivo de cabecera.

Mi pregunta es: ¿cómo hago para que funcione con todos mis proyectos y todos mis encabezados, sin tener que incluir realmente esa línea en cada archivo?

Respuesta

11

Je .... me siento estúpida responder a mis propias preguntas, pero la forma de saberlo prácticamente justo después de publicar que:

Ponga el fragmento de código

namespace boost { template<class T> class shared_ptr { T *dummy; }; } 

en un fichero de cabecera, llamado algo así como "doxygen_dummy.h", y asegúrese de que esté incluido en el espacio de trabajo o directorio de su proyecto. No es necesario que realmente # lo incluyan en ninguna parte (de hecho, no lo desea, para evitar violar la Regla de una sola definición). Solo necesita que Doxygen pueda verlo cuando escanea todos sus archivos.

+0

¡Gracias! Gran solución –

6

Gracias Eric, eso funcionó. Sin embargo, no me gustaron las clases dummy adicionales que ampliaron mis diagramas de colaboración, así que me preparé un poco más. Esta configuración de Doxyfile cambia todo el código boost :: smart_ptr a T *. Esto omite el smart_ptr y crea un enlace directo al tipo en el diagrama de colaboración.

INPUT_FILTER = "sed 's/boost::shared_ptr<\(.*\)>/\1*/'" 

Esto probablemente no es lo que quiere para documentos finales, ya que lo que realmente hace ocultar todas las referencias a smart_ptr como puntero sencillo, pero los diagramas de colaboración se vuelven mucho más legible.

+1

Me gusta esta solución: actualmente solo estoy usando doxygen para la documentación interna y la visualización de mi diseño SW, por lo que tener un encabezado ficticio es engorroso, especialmente si con frecuencia 'git clean' el espacio de trabajo. – arne

+1

Con la solución sed va a ser difícil conseguir que las expresiones /// sean correctas en todos los casos.Considere boost :: shared_ptr >, por ejemplo. Pero puede agregar fácilmente shared_ptr y vector (y cualquier otra clase de plantilla de biblioteca que esté utilizando) a su doxygen_dummy.h. – Waxrat

1

La pregunta puede estar desactualizada pero probé la solución de MattiasF que no era perfecta (no culpo).

IMO, utiliza un encabezado doxygen_dummy en una solución no adecuada para shared_ptr. La clase shared_ptr es solo un propósito de administración de memoria y seguramente no es necesaria en la documentación de Doxygen.

En el trabajo, uso un INPUT_FILTER con sed. Me parece un buen patrón (MEM :: es un alias de espacio de nombres):

INPUT_FILTER = "sed -e \"s/mem::shared_ptr<\([a-zA-Z0-9_]*\)> /\1* /g\" -e \"s/mem::shared_ptr<\(.*\)> /\1* /g\"" 

El primer patrón coincide con todas shared_ptr con plantillas simples, es decir, un tipo sin plantilla. El segundo patrón coincide con el resto de las plantillas shared_ptr independientemente del tipo complejo (con plantilla).

He encontrado un inconveniente: el nombre completo como plantilla, que incluye '::', aún no se maneja. La solución, aún no lo he hecho, es agregar un "personaje" :: en el primer patrón de sed.

+0

Esa es una solución interesante también. Gracias. –

Cuestiones relacionadas