OVH Cloud OVH Cloud

Editer du C++ template avec un editeur de texte

138 réponses
Avatar
Marc Boyer
Bonjour,

une petite question sur vos pratiques d'édition.

Pour écrire la définition de code de classe template, j'aimerais
bien séparer l'interface de l'implémentation.

Mais ça devient très lourd, du genre

template <class T>
typename X<T>::iterator X<T>::first_with(typename X<T>::cond& c){
....
}

alors que si je laisse dans la déclaration de la classe, ça donne
iterator first_with(cond& c);

Je m'en sort à grands coups de
#define X_TEMPLATE template<class T>
#define X X<T>
#define iterator typename X<T>::iterator
#define cond typename X<T>::cond

mais c'est lourd.

Vous faites comment vous ? Un super éditeur/IDE qui cache tout le sucre ?


Et sinon, pourquoi les classes (enfin, mon compilo) ne permettent elle pas
de faire

class X {
void foo(); // Déclaration
...
void foo(){...}; // Implementation
}

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

10 réponses

Avatar
Marc Boyer
Thomas Labourdette wrote:
Marc Boyer a écrit le mardi 16 Novembre 2004 09:15 :

Fabien wrote:

C'est que cette solution ne doit pas être des plus mauvaises...


J'avoue qu'en fait, je rève d'un bel IDE qui masque un peut
tout ce sucre: je sélectionne une classe, j'accède à sa définition,
son implémentation, ses spécialisation, tout ça bien rangé...


Il y a sourcenav qui est pas mal dans le genre :
http://sourcenav.sourceforge.net/


OK, je regarderais.

Merci,
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.



Avatar
Marc Boyer
In article , drkm wrote:
Marc Boyer writes:

wrote:

Ça donne surtout un très fort couplage des fichiers, ce qui devient vite
insoutenable dans les grands projets.


Tu peux préciser ?


Si tu inclus l'implémentation dans l'en-tête, cela rend le code
client dépendant non seulement de l'interface de la classe, mais
également de son implémentation. L'idiome du Pimpl pousse plus loin
ce raisonnement en s'affranchissant de la dépendance à la définition
complète de la classe. Il transfère pour cela les membres privés dans
une tierce classe.


Ah OK, en fait, dans le contexte (= template sans export), je
croyait qu'il y avait un autre sens.

Si je me souviens bien du contexte, il est question de modèles, et
tu inclus de toute façon l'implémentation dans l'en-tête. Même dans
ce cas, je te conseille de séparer (cmme tu sembles d'ailleurs le
faire) l'en-tête de l'implémentation, et d'inclure celle-ci dans
celui-là.


Oui, j'essaye de tout mettre dans un .cpp que le .hpp inclut.
C'est plus lisible, je retrouve plus vite mes petits, tout ça.
Et si j'ai un jour un compilo avec export, ça devrait
même compiler plus vite (pour le moment, c'est une horreur...)

Moi, déjà, si je pouvais voir la signature de ma classe rapidement
(sans avoir à passer par doxygen puis à revenir à xemacs...) se
serait pas mal.


EBrowse ou ECB pourraient t'intéresser.


ebrowse: tiens, c'est installé sur ma machine. Je vais regarder ça.
ECB: c'est l'autre lien que tu m'avais donné, c'est ça ?

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.



Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
writes:
Ce serait interessant de voir quelles seraient les reactions
maintenant. Et aussi de voir comment ca se combime avec la
proposition de David sur les modules.

Elle m'a l'air -- je n'ai fait que survoler -- d'aller dans le sens
d'une fusion interface/implementation comme en Java. Je ne suis pas
sur que j'aime cette caracteristique:


Ben, je comprends pas trop là, j'ai l'impression que c'est pire que
la solution actuelle.
Qu'est-ce que cela résoud ?

- le fichier d'interface est trop souvent la seule documentation,
l'enlever me gene et devoir chercher ce qui sera eparpille dans
le fichier d'implementation ne m'attire pas.


Oui.
Ca signifie qu'on ne peut plus en pratique éditer du C++ avec
un éditeur de texte: on est obligé d'outiller pour extraire l'interface
de l'implémentation.
Enfin bon, on pourra dire que ça n'a pas géné la diffusion
de Java jusqu'à présent.

- il est relativement courant d'avoir plusieurs implementations
pour la meme interface, partager le meme fichier definissant
celle-ci permet au compilateur de s'assurer de la coherence


Je trouve aussi.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Jean-Marc Bourguet wrote:
writes:
Ce serait interessant de voir quelles seraient les reactions
maintenant. Et aussi de voir comment ca se combime avec la
proposition de David sur les modules.

Elle m'a l'air -- je n'ai fait que survoler -- d'aller dans le sens
d'une fusion interface/implementation comme en Java. Je ne suis pas
sur que j'aime cette caracteristique:



Je me rends compte que je n'ai pas donner la reference du document.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1736.pdf

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
kanze
Fabien wrote in message
news:<4199390b$0$24047$...

Si tu regardes comment bossent les grands groupes d'édition de
logiciels (génère du code natif JNI par exemple ou ouvre le src
d'Apache HTTP Server), tu verras que tout le monde y va à grand coup
de #define. C'est que cette solution ne doit pas être des plus
mauvaises...


Vue la qualité des logiciels sur le marché, je ne sais pas si je
prendrais les grands groupes d'édition comme référence.

Et Fabien, depuis quand est-ce que tu t'es mis à poster à l'envers ?

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
kanze
"K. Ahausse" wrote in message
news:<4199dbe2$0$20993$...
"Marc Boyer" a écrit dans le
message de news:cncj0u$l3m$
In article <4199c5be$0$3315$, K. Ahausse
wrote:

VI[M]|[X]emacs + etags|ctags


Peut-on classer ce bel assemblage dans la catégorie IDE ?


Tout dépend de ce que tu entends par IDE.

Du fait que je développe pour et sur Solaris (actuellement), je ne
connais pas trop Visual Studios, mais dans la mésure qu'il s'adresse au
grand public, j'ai mes méfiances. Peut-être à tort -- Word, par exemple,
s'adresse au grand public, mais il permet aussi une façon de travailler
tout à fait correct pour des utilisateurs avertis aussi.

Enfin, gvim/emacs est un IDE dans le sens que tu lance la compilation
directement dans l'éditeur, et qu'il positionne automatiquement sur les
erreurs par la suite. Et c'est tout. Etags/ctags permet un peu d'aller
directement à la fonction, mais c'est limité : il sont manuel ; on ne
rétrouve donc pas la fonction qu'on vient d'écrire. Et autant que je
sache, il n'y a qu'une entrée par fonction, or que ce qu'il faudrait,
c'est une touche pour la déclaration (dans la classe), et une autre pour
la définition (dans la source) -- idéalement (AMHA, évidemment), il y
aurait aussi une touche qui ouvre un écran divisé, avec la déclaration
dans la classe en haut, et la définition en bas. Mais je ne crois pas
que ça existe avec vim/emacs. (Avec les templates, évidemment, ça serait
chouette s'il y avait aussi des parties pour chacune des
spécialisations.)

En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur. En
revanche, il faudrait que le « IDE » s'integre bien avec le système de
gestion des versions. Il y a des packages emacs qui le font, par
exemple, au moins pour des outils de gestion des versions qui fonction
un peu comme CVS. Mais dans l'ensemble, je n'ai rien trouvé qui integre
tout comme je l'aurais voulu. Ça, ajouté au fait que je m'y connais très
bien en ligne de commande Unix (et GNU make, qui est un langage en
lui-même), fait que je continue à travailler « à l'ancienne » ; je suis
convaincu qu'il pourrait avoir de meilleurs solutions, mais jusqu'ici,
je ne les ai pas trouvé. (La plus proche, c'est Clearcase. Qui n'integre
pas d'éditeur, mais qui gère la visibilité des versions d'une façon
excellent. Et pour fouilleter, Sniff+, mais je ne m'en servais que comme
super-éditeur ; la compilation, l'édition des liens, et le déboggage
étant toujours sous le contrôl d'un fichier de make invoqué à la main.

C'est sensé faire exactement ça.
Ca marchait très bien en C, comme ce n'est pas exactement mon
besoin, je n'ai pas regardé pour C++.



Moi non plus. Mais j'avoue que même en C... Parce qu'en C aussi, je veux
mon écran divisé, avec la struct sur laquelle la fonction travaille en
haut, et la fonction en bas. Quand je les ai régardé, il ne le faisait
pas, mais il se sont certainement amélioré depuis.

Désolé, mais ce que j'indiquais n'est pas QUE sensé marcher, cela
fonctionne parfaitement, avec souplesse, sans distinction C/C++. Ce
qu'il y manque c'est la mise au point aisée comme sous Windows.

Enfin bon, VC++ ne cache donc pas tout le sucre des templates.


Effectivement, 'tout' n'est pas gérer, cela va de soi Nul n'est obligé
apprécier VC++, cela va de soi.


En ce qui me concerne, il a un défaut de taille : il ne marche pas sous
Solaris:-).

Je me suis servi un peu du IDE de Sun (qui a changé de nom si souvent
que je ne sais plus comment il s'appelle). Il ne m'a pas convaincu.

Si une solution, au moins équivalente à VC++, existe sous Linux, un
énorme merci à celui qui pourrait la dévoiler.


J'imagine que s'il était exactement équivalent, il y aura des problèmes
de copyright ou de brêvet:-). En fait, ce qu'il faut, c'est de savoir ce
qu'on veut (et ce qu'on ne veut pas), et chercher les outils qui le
fournit par la suite. Apparamment, Visual Studios fournit ce que tu
veux. C'est tout à fait possible qu'il existe d'autres outils qui
fournissent ce que tu veux, sans pour autant être « équivalent ». Ne
sachant ni Visual Studios, ni ce que tu veux, je ne peux pas dire.

Ce que je peux dire, c'est qu'évaluer tout ce qui existe coûte cher en
temps. Et que donc, du coup, du moment qu'on a quelque chose qui marche,
même si ce n'est pas optimal, on se contente.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Marc Boyer wrote in message
news:<cncftd$ku0$...
wrote:
Marc Boyer wrote in message
news:<cna0hv$4qo$...

une petite question sur vos pratiques d'édition.

Pour écrire la définition de code de classe template, j'aimerais
bien séparer l'interface de l'implémentation.

Mais ça devient très lourd, du genre

template <class T>
typename X<T>::iterator X<T>::first_with(typename X<T>::cond& c){
....
}


C'est lourd. Le C++ exige en effet beaucoup de boilerplate.

Note toutefois qu'un peu de rédondance n'est pas forcement une
mauvaise chose.


Je vois bien que tout est important dans tout cela, mais dans un
contexte donné, ça fait redondance.


Je ne le conteste pas. J'ai simplement dit que toute rédondance n'est
pas forcement mauvaise. En général, dans un gros projet, les définitions
de classe ne sont pas écrites par la même personne qui en programme
l'implémentation. Sur un projet plus petit, la personne est peut-être la
même, mais elle ne le fait pas au même moment ; elle porte des chapeaux
différents selon qu'elle fasse la conception (la définition des classes)
ou l'implémentation.

Dans ce contexte, un peu de rédondance entre le fichier avec la
définition de classe et le fichier avec l'implémentation n'est pas
forcément une mauvaise chose. Un peu -- je suis d'accord que le fait qui
faut dupliquer toutes les informations à chaque définition d'une
fonction va un peu loin.

alors que si je laisse dans la déclaration de la classe, ça donne
iterator first_with(cond& c);


Ça donne surtout un très fort couplage des fichiers, ce qui devient
vite insoutenable dans les grands projets.


Tu peux préciser ?


Voir ci-dessus. En gros, la définition de la classe fait partie de la
conception, et a lieu bien avant l'implémentation. La modification dans
la définition de la classe a souvent des répercusions très larges, et
c'est préférable de ne pas la faire à la légère, lors de
l'implémentation des fonctions membres. Du coup, lors de
l'implémentation, les fichiers d'en-tête reste la plupart du temps sous
le contrôle du système de gestion des versions, et sont protégés en
écriture pour le développeur.

Je m'en sort à grands coups de
#define X_TEMPLATE template<class T>
#define X X<T>
#define iterator typename X<T>::iterator
#define cond typename X<T>::cond


J'espère que non. J'appelle ça l'obfuscation.


Fabien semblait dire que j'étais pas le seul.


Que tu n'es pas le seul à pratiquer l'obfuscation, c'est fort
possible:-).

mais c'est lourd.

Vous faites comment vous ? Un super éditeur/IDE qui cache tout le
sucre ?


Je ne sais pas si c'est un super éditeur, mais les deux éditeurs
dont je me sers (vim et emacs) ont tous les deux l'achevement
automatique des mots, ce qui réduit de beaucoup le nombre de
caractères à entrée. Sinon, les deux supportent aussi la
copier/coller, et l'enregistrement d'un bout de texte dans un
régistre nommé, quand j'ai une suite de fonctions avec un en-tête en
commun.


C'est pas tellement la frappe qui me dérange que la relecture.


Au contraire. C'est à la rélecture que je trouve que la rédondance a des
avantages. Je sais exactement et complétement ce auquel j'ai affaire
sans avoir besoin de régarder ailleurs.

Et sinon, pourquoi les classes (enfin, mon compilo) ne permettent
elle pas de faire

class X {
void foo(); // Déclaration
...
void foo(){...}; // Implementation
}


Parce que ça n'apportera rien, dans la mésure où le but, c'est que
l'implémentation et la définition de la classe soient dans des
fichiers distincts.


Moi, déjà, si je pouvais voir la signature de ma classe rapidement
(sans avoir à passer par doxygen puis à revenir à xemacs...) se serait
pas mal.


Comme j'ai dit dans un autre posting, je travaille en général avec un
écran divisé, avec la définition de la classe en haut, et
l'implémentation des fonctions en bas. Tous les éditeurs dont je me sers
(emacs et vim) supporte ça.

Ce que j'avais suggéré, à une époque, c'est la possibilité de
définir des portées d'implémentations, quelque chose du genre :

implement class X {
// ...
}

où toutes les fonctions définies dans la portée aurait appartenues à
class X. Étendu à ton exemple, ça aurait donné :

implement template< typename T > class X< T >
{
iterator first_with( cond& c ) { ... }
}

(À l'époque où j'y avais pensé, il n'y avait pas encore le typename
dans les templates.)


Je ne sais pas quels problèmes cela introduirait, mais ça
résoudrait les miens ;-)


Je ne sais pas si c'était parce que les gens voyaient des problèmes, ou
parce qu'ils ne voyaient pas d'avantages. Mais personellement, je trouve
encore que l'idée était bonne. Seulement, elle n'intéressait personne
d'autre à l'époque.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
K. Ahausse
a écrit dans le message de
news:


En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur. En


Ha! je suis surpris, edition+compilation+debug s'enchainant sur simplement
par l'action de touche de fonctions, me semblait le paradis du développeur.

revanche, il faudrait que le « IDE » s'integre bien avec le système de
gestion des versions. Il y a des packages emacs qui le font, par
exemple, au moins pour des outils de gestion des versions qui fonction
un peu comme CVS.


Effectivement. ( cela me fait penser que pressé par le temps je n'ai pas
regarder du coté de 'SourceSafe', a priori, cela devrait marcher... ).


Ce que je peux dire, c'est qu'évaluer tout ce qui existe coûte cher en
temps.


Oui, 'essuyer les platres', lorsque tant de choses restent à faire, coûte du
temps, sans parler du coup au moral quand on arrive à un constat d'echec...

Et que donc, du coup, du moment qu'on a quelque chose qui marche,
même si ce n'est pas optimal, on se contente.


Malheureusement, le risque est de rester coincer, ( comme je peux,
quotidiennement, le constater autour de moi ) avec des outils complétements
dépassés.

Avatar
Matthieu Moy
writes:

En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur.


C'est pourtant bien pratique : En général, quand tu lances un
déboggueur, la première chose que tu fais, c'est de mettre un
breakpoint (sauf pour débugger un segfault ...). Or, en général, à ce
moment là, j'ai déjà mon éditeur ouvert sur le bon fichier au bon
endroit ...

Ensuite, quand tu as bien utilisé le déboggueur, en général, tu
trouves un bug, et tu cherches à le corriger. Et là, si ton déboggueur
tourne dans ton éditeur, tu es déjà au bon endroit pour pouvoir editer
le source.

--
Matthieu

Avatar
Marc Boyer
wrote:
Marc Boyer wrote in message
news:<cncftd$ku0$...
wrote:
C'est lourd. Le C++ exige en effet beaucoup de boilerplate.
Note toutefois qu'un peu de rédondance n'est pas forcement une
mauvaise chose.


Je vois bien que tout est important dans tout cela, mais dans un
contexte donné, ça fait redondance.


Je ne le conteste pas. J'ai simplement dit que toute rédondance n'est
pas forcement mauvaise. En général, dans un gros projet, les définitions
de classe ne sont pas écrites par la même personne qui en programme
l'implémentation. Sur un projet plus petit, la personne est peut-être la
même, mais elle ne le fait pas au même moment ; elle porte des chapeaux
différents selon qu'elle fasse la conception (la définition des classes)
ou l'implémentation.

Dans ce contexte, un peu de rédondance entre le fichier avec la
définition de classe et le fichier avec l'implémentation n'est pas
forcément une mauvaise chose. Un peu -- je suis d'accord que le fait qui
faut dupliquer toutes les informations à chaque définition d'une
fonction va un peu loin.


Je suis d'accord avec toi.

alors que si je laisse dans la déclaration de la classe, ça donne
iterator first_with(cond& c);


Ça donne surtout un très fort couplage des fichiers, ce qui devient
vite insoutenable dans les grands projets.


Tu peux préciser ?


Voir ci-dessus. En gros, la définition de la classe fait partie de la
conception, et a lieu bien avant l'implémentation.


Oui, c'est vrai, c'est comme cela qu'il faudrait faire ;-)

Je m'en sort à grands coups de
#define X_TEMPLATE template<class T>
#define X X<T>
#define iterator typename X<T>::iterator
#define cond typename X<T>::cond


J'espère que non. J'appelle ça l'obfuscation.


Fabien semblait dire que j'étais pas le seul.


Que tu n'es pas le seul à pratiquer l'obfuscation, c'est fort
possible:-).


Oui...
Je suppose que toi tu n'as pas ce problème puisque tu évites
en général le code template utilisateur.

C'est pas tellement la frappe qui me dérange que la relecture.


Au contraire. C'est à la rélecture que je trouve que la rédondance a des
avantages. Je sais exactement et complétement ce auquel j'ai affaire
sans avoir besoin de régarder ailleurs.


En général oui, mais dans ce cas, non...

Moi, déjà, si je pouvais voir la signature de ma classe rapidement
(sans avoir à passer par doxygen puis à revenir à xemacs...) se serait
pas mal.


Comme j'ai dit dans un autre posting, je travaille en général avec un
écran divisé, avec la définition de la classe en haut, et
l'implémentation des fonctions en bas. Tous les éditeurs dont je me sers
(emacs et vim) supporte ça.


Je fais ça aussi souvent (enfin, moi c'est def à gauche, impl
à droite et compilation en bas...)

Je ne sais pas quels problèmes cela introduirait, mais ça
résoudrait les miens ;-)


Je ne sais pas si c'était parce que les gens voyaient des problèmes, ou
parce qu'ils ne voyaient pas d'avantages. Mais personellement, je trouve
encore que l'idée était bonne. Seulement, elle n'intéressait personne
d'autre à l'époque.


Je ne sais pas si l'intérêt que j'y porte moi peut suffire
à changer quoi que ce soit.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.