Puis-je vérifier quels modèles de fonctions ont été instanciés au moins une fois?

J’ai beaucoup de code de modèle. Etant donné qu’un code de modèle incorrect ne génère pas d’erreur de compilateur à moins qu’il ne soit compilé, puis-je vérifier les fonctions de modèle réellement compilées par le compilateur et celles qui ont été ignorées?

EDIT 2:

Si un modèle de classe ou un modèle de fonction particulier est instancié une fois, quel que soit le type de paramètre, c’est OK. Je veux la liste des modèles de fonction / classe qui n’ont jamais été instanciés sous aucune forme.

Un exemple particulier est le suivant. Ce sont deux fonctions de modèle distinctes, et j’aimerais savoir si l’une ou les deux n’est jamais instanciée.

template  void advance( T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag ) template  void advance( T_InputItr& aItr, T_Distance aN, random_access_iterator_tag ) 

EDIT: Actuellement, pour les classes, je les instancie manuellement dans le fichier .cpp comme ceci:

 template TClass; 

pour tous les types qui m’intéressent. C’est bien beau. Mais c’est si je me souviens de le faire. Parfois, j’ai besoin d’écrire beaucoup de petites classes / fonctions de modèles où j’oublie d’instancier manuellement certains des modèles de fonctions / classes et de les découvrir plus tard. J’aimerais que le compilateur me le dise.

Alternativement, si je pouvais obtenir la liste des modèles de fonction / classe instanciés (pour n’importe quel paramètre), je pourrais alors la comparer à la liste complète que je pourrais rechercher dans le code.

Un autre avantage serait de “tester” les méthodes compilées dans une classe de modèle utilisant des caractères de type pour comstackr sélectivement certaines fonctions. Je veux être certain que ma logique de sélection des fonctions correctes est correcte avant de poursuivre.

Quelqu’un a expliqué comment “tout peut être résolu en ajoutant un niveau d’indirection” – vous pouvez append une assertion statique à chaque fonction et regarder la compilation échouer:

 template  struct Asserter { static const bool value = false; }; template  struct Foo { void foo() { static_assert(Asserter::value, "Foo::foo() is being comstackd."); } void bar() { static_assert(Asserter::value, "Foo::bar() is being comstackd."); } }; int main() { Foo f; //f.foo(); // static assertion! } 

Si vous ne voulez pas que la compilation soit interrompue à chaque étape, vous pouvez émettre un avertissement statique Boost ou quelque chose ayant un effet similaire.

Étant donné que vous utilisez MSVC 2008, vous pouvez le faire en générant un fichier de carte de l’éditeur de liens et en recherchant toutes les instanciations de cette fonction ou en inspectant le fichier .pdb via DIA. Vous voudrez désactiver le pliage COMDAT avec l’indicateur d’éditeur de liens / OPT: NOICF afin de pouvoir rechercher les fonctions qui sont compilées dans le même assemblage.

Vous pouvez exécuter votre fichier exécutable via un outil d’parsing statique après la compilation, à condition d’avoir configuré votre compilateur pour y inclure les tables de symboles appropriées … qui afficheront toutes les classes instanciées ainsi que leurs arguments de modèle. Voici un lien vers une liste d’outils pouvant être utilisés pour l’parsing de code statique.