Quand on fait de la métaprogrammation à l'aide de modèles C++, est-il une méthode qui peut être utilisée, comme une sorte de débogueur, à l'étape à travers la façon dont les modèles sont instanciés et respecté? Il semble dès maintenant, lors de la création d'un réseau compliqué de modèles, il n'y a vraiment pas une très bonne façon de leur débogage autre que de regarder les messages d'erreur du compilateur pour voir comment les modèles sont instanciés (s'il y a des erreurs de compilation), et la tentative de travailler à rebours à partir des messages d'erreur si quelque chose d'inattendu est généré. Je ne suis pas vraiment sûr si ce que je suis à la recherche de même qu'il existe, comme il devrait être quelque chose qui se fait au moment de la compilation, mais au fond, ce serait une méthode, un peu comme entrer dans code et l'examen de la trame de pile en gdb
lors de l'exécution, où le compilateur pourrait être arrêté et de l'environnement a examiné pour la séquence par laquelle un modèle ou un ensemble de modèles imbriqués est instanciée.
Par exemple, disons que j'ai créé un code simple comme suit:
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;
}
Je sais que c'est relativement facile de code à suivre, mais les modèles peuvent être tout à fait un peu plus compliqué, surtout quand on fait de la métaprogrammation, la récursivité, etc. Je comprends que le compilateur va émettre des messages d'erreur qui peuvent être utilisées pour déduire la façon dont les modèles sont instanciés, mais je me demande aussi ce qui peut être fait lorsque le modèle de code est correct dans un sens syntaxique, mais le moteur d'exécution résultats sont toujours incorrectes. Il serait bien par exemple de disposer d'une méthode pour arrêter le compilateur et de voir ce qu' test
, ainsi qu' int_return_type
et float_return_type
, a été instanciée avec, ou ce que les instanciations ont été un échec.
Sont les seules options disponibles dès maintenant pour le débogage des modèles à ce niveau de granularité 1) les messages d'erreur du compilateur lorsque le code est incorrect, et 2) une combinaison des désassembleurs et débogueurs pour voir ce que instancié code a été généré si les résultats sont incorrects? Ou il y en a quelques autres utilitaires qui l'aidera à "regarder" la façon dont les modèles sont instanciés, et de voir/inspecter ce code est généré par le compilateur d'enquêter et de débogage modèle erreurs?