Al hacer metaprogramación con plantillas C++, ¿hay algún método que pueda usarse, algo así como un depurador, para ver cómo se crean y ejecutan las plantillas? Parece que ahora mismo, al crear una red complicada de plantillas, realmente no hay una forma muy buena de depurarlas aparte de mirar los mensajes de error del compilador para ver cómo se crean las instancias de las plantillas (si hay errores de compilación), y el intento de retroceder desde los mensajes de error si se genera algo inesperado. No estoy realmente seguro de si lo que estoy buscando existe, ya que tendría que ser algo que se hace en tiempo de compilación, pero básicamente sería un método, algo así como recorrer el código y examinar el marco de pila en gdb
en tiempo de ejecución, donde se podría detener el compilador y examinar el entorno para ver la secuencia mediante la cual se crea una instancia de una plantilla o conjunto de plantillas anidadas.Instanciaciones de plantillas de depuración
Por ejemplo, digamos que he creado un código simple como la siguiente:
template<typename T, typename R = void>
struct int_return_type {};
template<typename R>
struct int_return_type<int, R>
{
typedef R type;
};
template<typename T, typename R = void>
struct float_return_type {};
template<typename R>
struct float_return_type<float, R>
{
typedef R type;
};
template<typename T>
typename int_return_type<T>::type test()
{
cout << "T type is int" << endl;
}
template<typename T>
typename float_return_type<T>::type test()
{
cout << "T type is float" << endl;
}
int main()
{
test<int>();
test<float>();
return 0;
}
Sé que esto es un código relativamente fácil de seguir, pero las plantillas pueden llegar a ser muy un poco más complicado, sobre todo cuando se hace metaprogramming, recursividad, etc. Entiendo que el compilador emitirá mensajes de error que se pueden usar para deducir cómo se crean instancias de las plantillas, pero también me pregunto qué se puede hacer cuando el código de la plantilla real es correcto en un sentido sintáctico, pero el tiempo de ejecución los resultados siguen siendo incorrectos Sería bueno, por ejemplo, tener un método para detener el compilador y ver qué test
, así como int_return_type
y float_return_type
, estaban siendo instanciados, o qué instancias estaban fallando.
Son las únicas opciones disponibles ahora para depurar plantillas con este nivel de granularidad 1) los mensajes de error del compilador cuando el código es incorrecto, y 2) una combinación de desensambladores y depuradores para ver qué código instanciado se generó si la ejecución los resultados de tiempo son incorrectos? ¿O existen algunas otras utilidades que ayudan a "ver" cómo se crean instancias de las plantillas y a ver/inspeccionar qué código genera el compilador para investigar y depurar errores de plantilla?
que no sea 'static_assert' para hacer cosas que quiere ver en los errores No creo que haya nada para ayudar – Flexo