¿Cuenta automáticamente el número de clases instanciadas en un TMP?

Dado un metaprogtwig de plantilla (TMP), ¿los comstackdores de C ++ producen estadísticas de comstackción que cuentan el número de clases creadas? ¿O hay alguna otra forma de obtener este número automáticamente? Así, por ejemplo, el factorial obiquitous

#include  template struct fact { enum { value = N * fact::value }; }; template struct fact { enum { value = 1 }; }; int main() { const int x = fact::value; std::cout << x << "\n"; return 0; } 

Me gustaría recuperar el número 3 (ya que la instancia , fact y fact están instanciadas). Este ejemplo es trivial, pero cuando empiezas a usar, por ejemplo, Boost.MPL, los tiempos de comstackción realmente explotan, y me gustaría saber cuánto de eso se debe a las instancias de clase ocultas. Mi pregunta es principalmente para Visual C ++, pero las respuestas para gcc también serían apreciadas.

EDITAR : mi enfoque actual muy frágil para Visual C ++ es agregar el interruptor de comstackción de uno de los videos / d1reportAllClassLayout de Stephan T. Lavavej y hacer un conteo de palabras grep + en el archivo de salida, pero (a) aumenta enormemente los tiempos de comstackción y (b) La expresión regular es difícil de obtener 100% correcto.

Hice un cambio de una línea a GCC que hace que imprima el nombre de cada plantilla de clase a medida que lo ejemplifica. Ya puede llamar al front-end c ++ cc1plus directamente sin el indicador -quiet para obtener lo mismo para las plantillas de función.

Todavía no he logrado convertir eso en una opción adecuada de GCC, es solo un truco en mi propio árbol de fonts. Estoy pensando en implementarlo como un complemento, pero no está cerca de la parte superior de mi lista de TODO.

Por supuesto, no hay una forma portátil de hacer esto.

Hay formas piratas de hacerlo para la mayoría de los comstackdores. Ya has encontrado uno para MSVC. Para gcc, probablemente puedas usar gccxml. O, para cualquier comstackdor de código abierto (gcc o clang), debería ser bastante simple agregar código en el punto de creación de instancias que mantiene el recuento o registra algo que puede filtrar después de que se realiza la comstackción.

Para Clang / LLVM, puede crear un complemento que enganche la creación de instancias, que es mucho más limpia, pero probablemente en realidad sea más trabajo.

Una comstackción con símbolos de depuración, sin optimización y sin eliminación puede terminar con los nombres destrozados de cada creación de instancias, para los cuales puede hacer grep. Sin embargo, algunos comstackdores (incluido gcc) siempre incorporarán al menos algunos métodos, ya sea que lo desee o no. Si está dispuesto a modificar su código, probablemente pueda forzarlo a generar instancias fuera de línea, tal vez algo como esto:

 template struct fact { enum { value = N * fact::value }; int *dummy() { return &fact::value; } }; 

Hay una herramienta escrita por Steven Watanabe que se puede usar para contar el número de instancias de plantilla. Puedes conseguirlo aquí . Básicamente, modifica el código para que se genere una advertencia del comstackdor cada vez que se crea una instancia de una clase y luego se puede procesar el texto resultante con expresiones regulares, por ejemplo.