IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Templates : quels outils


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut Templates : quels outils
    Bonjour à tous,

    Ça y est, je suis enfin tombé (professionnellement, j'entends) sur un code développé par quelqu'un de plus fanatique que moi.

    Moi qui prône le bien coder, le boost, le template, la meta-prog à tous crins depuis de longues années, j'ai aujourd'hui pour mission de péréniser un code tellement plein de templates, que j'ai le plus grand mal à le lire.

    Pour vous donner une idée, une recherche du mot clef "typename" dans le projet donne 8417 résultats pour 911 fichiers (*)

    J'en appelle donc à tous mes co-fanatiques en cette discipline qu'est l'abus de templates : ceux avec lesquels j'ai eu l'occasion d'avoir de long débats passionnés (ici même et ailleurs), et ceux qui ne m'ont pas encore offert cette chance.

    Ma question est simple : "Quels outils utilisez-vous pour parcourir vos codes templatés ?"

    Mieux qu'une explication, voici un exemple :
    Toto.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Toto
    {
    	typedef int Count;
    }
    Titi.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T> class Titi
    {
    	typedef T::Count Count;
    	Count count;
    }
    Tata.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T> class Tata
    {
    	typedef Titi<T> Tutu;
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    	Tata<Toto> > instance_de_Tata;
    ...
    Tata.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    	Tutu tutu;
    	tutu.count; // <--- de quel type est ceci ?
    ...
    Quand je tombe sur la ligne marquée du fichier Tata.hpp, aujourd'hui, il me faut une bonne minute pour remonter au type de "count". (d'autant plus que les fichiers sont répartis dans de nombreux répertoires, et que mon IDE ne sait, la plupart du temps répondre que : "symbol not defined").

    Cette minute me prend d'énergie, qu'en général quand j'obtiens ma réponse, je n'ai plus du tout en tête la raison pour laquelle je me suis posé cette question.

    Ma découverte du code est donc excessivement longue, et par la même, la maintenance engendrée doit l'être aussi.

    J'ai donné le code à manger à tous les "code completer" dont je dispose (dont celui de crosoft). Et sous prétexte de ne pas savoir résoudre parfaitement le problème, aucun d'entre eux ne semble le résoudre même partiellement.

    En particulier, le lien entre Tata et Toto est très compliqué à faire. Je me contenterais d'un système semi-automatique, mais cela ne semble pas exister.

    A l'heure actuelle, je n'ai que trois pistes :
    - écrire mon propre outil (ouhla !)
    - proposer une réorganisation du code (en supprimant une partie des templates)
    - écrire un pseudo-dictionnaire (étant donné que souvent les mêmes noms de typename ou presque désignent souvent les mêmes types)

    Avant de me lancer sur l'une ou l'autre de ces pistes, je préfèrerais savoir si l'un d'entre vous connait un outil qui pourrait m'aider.

    Merci à ceux qui ont lu.
    Merci à ceux qui répondront.


    (*) je sais, certains vont me dire que l'on peut (et que l'on doit) utiliser des typedef même si l'on n'utilise pas de template, et ils auront raison. Mais j'espère qu'ils m'accorderont le fait que cette utilisation est négligeable (si ce n'est en importance, au moins en volume) devant celle des typename et typedef induits par les templates.

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    L'arroseur arrosé.
    Je vais suivre attentivement ce topic, car j'ai le même genre de problème que tu as parfaitement bien décris face à du code fortement templaté.

    Il m'est arrivé sur des projets où les temps de compilation ne sont pas trop long de rajouter artificiellement des erreurs dans le code pour profiter des messages d'erreur du compilateur.

    Par exemple remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tutu tutu;
    tutu.count; // <--- de quel type est ceci ?
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tutu tutu;
    static_cast<float****>(tutu.count); // la conversion échoue et force la compilation à sortir en erreur
    Même si c'est vrai que dans ce cas le message émit par VS2008 n'est pas particulièrement glorieux...
    >Compilation en cours...
    1>main.cpp
    1>mes documents\visual studio 2008\projects\testbasiccpp\testbasiccpp\tata.hpp(6) : error C2440: 'static_cast'*: impossible de convertir de 'int' en 'float ****'
    1> La conversion d'un type intégral en type pointeur nécessite reinterpret_cast, un cast de style C ou un cast de style fonction
    1> mes documents\visual studio 2008\projects\testbasiccpp\testbasiccpp\tata.hpp(4)*: lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1> mes documents\visual studio 2008\projects\testbasiccpp\testbasiccpp\main.cpp(493)*: voir la référence à l'instanciation de la classe modèle 'Tata<T>' en cours de compilation
    1> with
    1> [
    1> T=Toto
    1> ]
    1>Le journal de génération a été enregistré à l'emplacement "file://Mes documents\Visual Studio 2008\Projects\TestBasicCpp\TestBasicCpp\Debug\BuildLog.htm"
    1>TestBasicCpp - 1 erreur(s), 0 avertissement(s)
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    "impossible de convertir de 'int' en 'float ****'"
    Bon avec cette technique on sait quand même que le type final de tutu.count; est bien un int, mais j'avoue que la ligne suivante est un peu déprimante :
    " lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>".

    Je serais curieux de savoir ce que le compilateur clang émet comme erreur car il est réputé pour générer des messages d'erreur largement supérieur à ceux de GCC et VS sur du code fortement templaté.

    Mais c'est vrai qu'au final ce n'est pas une technique vraiment utilisable car sur un vrai projet C++ les temps de compilation peuvent vite dépasser les quelques dizaines de seconde donc ça ne vaut plus vraiment le coup.

    Edit :
    Visiblement il y a quelques progrès sur les messages d'erreur avec VS2010.
    main.cpp
    mes documents\visual studio 2010\testbasiccpp\testbasiccpp\tata.hpp(6): error C2440: 'static_cast'*: impossible de convertir de 'int' en 'float ****'
    1> La conversion d'un type intégral en type pointeur nécessite reinterpret_cast, un cast de style C ou un cast de style fonction
    1> mes documents\visual studio 2010\testbasiccpp\testbasiccpp\tata.hpp(4)*: lors de la compilation de la fonction membre 'void Tata<T>::foo(void)' de la classe modèle
    1> with
    1> [
    1> T=Toto
    1> ]
    1> mes documents\visual studio 2010\testbasiccpp\testbasiccpp\main.cpp(493)*: voir la référence à l'instanciation de la classe modèle 'Tata<T>' en cours de compilation
    1> with
    1> [
    1> T=Toto
    1> ]
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  3. #3
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Merci pour ta réponse. Je n'avais en effet pas pensé à utiliser le compilateur de cette manière.

    Mais comme tu le soulignes toi-même : ça marche mais ce n'est pas très pratique (surtout que le temps de compilation des codes fortement templatés ne permet pas forcément d'en faire une utilisation massive).

    Citation Envoyé par Arzar Voir le message
    L'arroseur arrosé.
    Je vais suivre attentivement ce topic, car j'ai le même genre de problème que tu as parfaitement bien décris face à du code fortement templaté.
    En 10 ans de carrière, c'est la première fois que je suis confronté au problème. (d'habitude, c'est moi qui écrit tout le code template, du coup je le maitrise).

    Je ne pense pas qu'il existe énormément de projets industriels qui présente ce problème. Conclusions : On doit être sur le même projet.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Houla, détrompes-toi, j'ai vu passer beaucoup de code qui abuse des templates.
    Moins en France, c'est vrai, mais du code qui vient de certains pays d'europe de l'est ou de ricanie (le pays des ricains), j'en ai vu beaucoup.
    Bon par contre, je ne suis pas fan des templates et je ne pourrais pas vous aider sur ce coup-là. Sauf peut-être un conseil (qui a déjà été dit implicitement par Arzar), compiler le code avec l'option 0x, car il me semble qu'un effort a été fait sur l'analyse des templates. Donc si tu es sous visual par exemple, passe à visual10 et peut-être que l'intellisense sera plus apte à retrouver les types de tes variables.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    J'ai l'impression qu'on va être beaucoup à lire avec attention les réponses à ce thead

    Bon ben, pas très original, comme Arzar et comme probablement beaucoup de monde, le premier réflexe c'est le compilo. J'essaie d'avoir un environnement qui me permette d'utiliser plusieurs compilateurs. Ca rend (parfois) les messages moins abscons.

    Ensuite, le 'killer' outil que j'utilise il s'appelle ........ Bic 2.0 avec feuille de papier intégrée ... avec un bon 'Search file' (les analyseurs statiques de code ont tendance à un peu s'embrouiller).

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    perso, j'aime bien compiler avec /W4 ou -Wall etc et utiliser boost::mpl::print<T> qui emet un warning contenant le nom du type T.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Feriaman Voir le message
    (*) je sais, certains vont me dire que l'on peut (et que l'on doit) utiliser des typedef même si l'on n'utilise pas de template, et ils auront raison.
    Moi, je n'aime pas les typedef... Faut vraiment que les formes soient très longues pour que j'y ai recours.

Discussions similaires

  1. [Templates] Quel système utilisez-vous ? Pourquoi ?
    Par narmataru dans le forum Bibliothèques et frameworks
    Réponses: 270
    Dernier message: 26/03/2011, 00h15
  2. Quels outils logiciels utiliser pour faire son site ?
    Par tripper.dim dans le forum Outils
    Réponses: 36
    Dernier message: 22/05/2008, 18h39
  3. Quel outil choisir pour un développement SQL-Server ?
    Par Mouse dans le forum Débats sur le développement - Le Best Of
    Réponses: 23
    Dernier message: 12/08/2003, 06h23
  4. Quel Outil pour les applis Industrielles ET bases de données
    Par ThierryAIM dans le forum Débats sur le développement - Le Best Of
    Réponses: 8
    Dernier message: 23/04/2003, 09h14
  5. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo