OVH Cloud OVH Cloud

Template, argument par defaut et declaration en avant

35 réponses
Avatar
Marc Boyer
Bonjour,

bon, je reprends un (gros) code C++, alors je vais avoir je crois pas
mal de questions.

Pour le moment, j'ai un problème de template + argument template par defaut
+ declaration en avant.

Soit une classe avec un argument template par defaut, genre
template <class T,
template <class X> cont= std::list>
class Collection {
T t;
cont<int> c;
};

J'ai besoin dans une autre classe de faire une déclaration en avant,
mais comme je ne fixe pas dans ce cas de valeur au 2ème argument
template, il faut que je fasse une déclaration en avant complète:
template <class T,
template <class X> cont= std::list>
class Collection;

Et quand je définis la classe, il rale d'une redéclaration
des arguments par défaut...

J'ai pensé à un fichier du genre
CollectionFwd.h
dans la même veine que
iosfwd
mais est-ce que je sors pas le marteau pour écraser une mouche ?

Est-ce qu'il y a des pratiques "habituelles" ?

Vous faites comment vous ?

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...

10 réponses

1 2 3 4
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:


En ce moment, on réfléchit sur un système de module pour
« The Pivot (IPR/XPR) »

http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf

et même là, le moins qu'on puisse dire, c'est qu'on fait, pour le
moment, des hypothèses sur les « programmes raisonnablement bien écrits
» :-)


Interessant. J'ai peur de ne pas avoir compris le slide 9.

Est-ce que vous avez regarde ASIS pour l'Ada (qui m'a l'air d'avoir le
meme objectif et est si j'ai bonne memoire standardise; je ne sais pas
s'il y a d'autres implementation de celle de Gnat).

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
Christophe de VIENNE
En ce moment, on réfléchit sur un système de module pour
« The Pivot (IPR/XPR) »

http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf

et même là, le moins qu'on puisse dire, c'est qu'on fait, pour le
moment, des hypothèses sur les « programmes raisonnablement bien écrits
» :-)


C'est super interessant comme truc. Y a-t-il plus d'information à ce
sujet quelque part ?

A+

Christophe

--
Christophe de Vienne

Avatar
Christophe de VIENNE
Gabriel Dos Reis writes:
http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf


Interessant. J'ai peur de ne pas avoir compris le slide 9.


Pareil :-


--
Christophe de Vienne


Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

En ce moment, on réfléchit sur un système de module pour
« The Pivot (IPR/XPR) »

http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf


Interessant. Je crains n'avoir pas compris le slide 9.

Avez-vous regarde ASIS pour l'Ada qui m'a l'air d'avoir le meme
objectif que votre IPR. Je crois que c'est standardise mais je ne
connais pas d'autre implementation que celle de Gnat.

et même là, le moins qu'on puisse dire, c'est qu'on fait, pour le
moment, des hypothèses sur les « programmes raisonnablement bien écrits
» :-)


J'imagine assez bien une partie des problemes -- je sais qu'il doit y
en avoir d'autres :-)

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
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > En ce moment, on réfléchit sur un système de module pour
| > « The Pivot (IPR/XPR) »
| >
| > http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf
|
| Interessant. Je crains n'avoir pas compris le slide 9.

C'étais un machin d'une demi-heure, alors du coup c'est un peu
condensé. Au slide p.9, je voulais dire que les parseurs pour XPR
doivent être simples à écrire et qu'on devrait avoir la même efficacité
que si on faisait un simple « cat ».

| Avez-vous regarde ASIS pour l'Ada qui m'a l'air d'avoir le meme
| objectif que votre IPR. Je crois que c'est standardise mais je ne
| connais pas d'autre implementation que celle de Gnat.

Intéressant, je ne l'avais pas du tout regardé. Merci du tuyau.

| > et même là, le moins qu'on puisse dire, c'est qu'on fait, pour le
| > moment, des hypothèses sur les « programmes raisonnablement bien écrits
| > » :-)
|
| J'imagine assez bien une partie des problemes -- je sais qu'il doit y
| en avoir d'autres :-)

On peut faire du calcul de préfixes et essayer de représenter les
mêmes préfixes (suites de même includes) comme un module séparé.
Mais que se passe-t-il si on rencontre ailleurs plusieurs fois la même
suite de token

struct A { .... };

?

Pour le moment, on suppose qu'un programme « bien écrit » ne contient
rien de tel, donc on aurait plusieurs classes distinctes :-)

-- Gaby
Avatar
Gabriel Dos Reis
Christophe de VIENNE writes:

| > En ce moment, on réfléchit sur un système de module pour
| > « The Pivot (IPR/XPR) »
| > http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf
| > et même là, le moins qu'on puisse dire, c'est qu'on fait, pour le
| > moment, des hypothèses sur les « programmes raisonnablement bien écrits
| > » :-)
|
| C'est super interessant comme truc. Y a-t-il plus d'information à ce
| sujet quelque part ?

Très bientôt.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > En ce moment, on réfléchit sur un système de module pour
| > « The Pivot (IPR/XPR) »
| >
| > http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf
|
| Interessant. Je crains n'avoir pas compris le slide 9.

C'étais un machin d'une demi-heure, alors du coup c'est un peu
condensé. Au slide p.9, je voulais dire que les parseurs pour XPR
doivent être simples à écrire et qu'on devrait avoir la même efficacité
que si on faisait un simple « cat ».


Ca j'avais compris. Je faisais allusion a la page 9/17 d'acroread,
mais elle est numerotee 8 (de meme d'ailleurs que la suivante). Il
s'agit de l'utilisation de template cacher les implementations.

[...]
| J'imagine assez bien une partie des problemes -- je sais qu'il doit y
| en avoir d'autres :-)

On peut faire du calcul de préfixes et essayer de représenter les
mêmes préfixes (suites de même includes) comme un module séparé.
Mais que se passe-t-il si on rencontre ailleurs plusieurs fois la même
suite de token

struct A { .... };

?

Pour le moment, on suppose qu'un programme « bien écrit » ne
contient rien de tel, donc on aurait plusieurs classes distinctes
:-)


Je vois :-) Je me suis penche aussi sur le probleme de faire de la
creation automatique de "bindings" C++ pour un langage ayant une
notion de module bien definie (disons Ada par exemple).

Ou ca devient tres gai, c'est quand des gens se sont amuses a detecter
que d'autres bibliotheques etaient chargees pour ajouter ou modifier
les declarations d'un include.

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
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > Jean-Marc Bourguet writes:
| >
| > | Gabriel Dos Reis writes:
| > |
| > | > En ce moment, on réfléchit sur un système de module pour
| > | > « The Pivot (IPR/XPR) »
| > | >
| > | > http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf
| > |
| > | Interessant. Je crains n'avoir pas compris le slide 9.
| >
| > C'étais un machin d'une demi-heure, alors du coup c'est un peu
| > condensé. Au slide p.9, je voulais dire que les parseurs pour XPR
| > doivent être simples à écrire et qu'on devrait avoir la même efficacité
| > que si on faisait un simple « cat ».
|
| Ca j'avais compris. Je faisais allusion a la page 9/17 d'acroread,
| mais elle est numerotee 8 (de meme d'ailleurs que la suivante). Il
| s'agit de l'utilisation de template cacher les implementations.

Ah, je vois.

Au départ, l'idée est qu'on sépare classe interface, de class
implémentation. Donc on avait des classes du genre

struct Expr { /* class abstraite */ };
struct Decl : Decl { /*... idem */ };
struct Var : Decl { /* itoo */ };

et dans la partie implémentation

struct Expr_impl : Expr { /* implemente Expr */ };
struct Decl_impl : Decl, Expr_impl { /* ... */ };
struct Var_impl : Var, Decl_impl { /* ... */ }

évidemment, cela ne marche que si les héritages sont virtuels aux
points de jonction. Problème classique. Cela devenait un peu complexe
et rigide.

On a décidé d'éliminer ces dérivations viruelles.
Alors on a fait (grosso modo) :

template<class Interface>
struct Expr_impl : Interface { .... };

template<class Interface>
struct Decl_impl : Expr_impl<Interface> { ... };

struct Var_impl : Decl_impl<Var> { .... };

Du coup, on a la chaine d'heritage suivante

Var_impl -> Decl_impl<> -> Expr_impl -> Var -> Decl -> Expr

Ce qui nous donne la sémantique qu'on voulait au départ.

[...]

| Je vois :-) Je me suis penche aussi sur le probleme de faire de la
| creation automatique de "bindings" C++ pour un langage ayant une
| notion de module bien definie (disons Ada par exemple).
|
| Ou ca devient tres gai, c'est quand des gens se sont amuses a detecter
| que d'autres bibliotheques etaient chargees pour ajouter ou modifier
| les declarations d'un include.

Arf :-( -- mais je présume que c'est courant :-/

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > Jean-Marc Bourguet writes:
| >
| > | Gabriel Dos Reis writes:
| > |
| > | > En ce moment, on réfléchit sur un système de module pour
| > | > « The Pivot (IPR/XPR) »
| > | >
| > | > http://www-unix.mcs.anl.gov/workshops/DSLOpt/Talks/DosReis.pdf
| > |
| > | Interessant. Je crains n'avoir pas compris le slide 9.
| >
| > C'étais un machin d'une demi-heure, alors du coup c'est un peu
| > condensé. Au slide p.9, je voulais dire que les parseurs pour XPR
| > doivent être simples à écrire et qu'on devrait avoir la même efficacité
| > que si on faisait un simple « cat ».
|
| Ca j'avais compris. Je faisais allusion a la page 9/17 d'acroread,
| mais elle est numerotee 8 (de meme d'ailleurs que la suivante). Il
| s'agit de l'utilisation de template cacher les implementations.

Ah, je vois.

Au départ, l'idée est qu'on sépare classe interface, de class
implémentation. Donc on avait des classes du genre

struct Expr { /* class abstraite */ };
struct Decl : Decl { /*... idem */ };
struct Var : Decl { /* itoo */ };

et dans la partie implémentation

struct Expr_impl : Expr { /* implemente Expr */ };
struct Decl_impl : Decl, Expr_impl { /* ... */ };
struct Var_impl : Var, Decl_impl { /* ... */ }

évidemment, cela ne marche que si les héritages sont
virtuels aux points de jonction. Problème classique. Cela
devenait un peu complexe et rigide.


Comme tu dis, c'est pour ça que ça m'intéressait.

On a décidé d'éliminer ces dérivations viruelles.
Alors on a fait (grosso modo) :

template<class Interface>
struct Expr_impl : Interface { .... };

template<class Interface>
struct Decl_impl : Expr_impl<Interface> { ... };

struct Var_impl : Decl_impl<Var> { .... };

Du coup, on a la chaine d'heritage suivante

Var_impl -> Decl_impl<> -> Expr_impl -> Var -> Decl -> Expr

Ce qui nous donne la sémantique qu'on voulait au départ.


C'est ce que j'avais compris. Mais c'est quoi que vous
utilisez pour Decl_impl? Si c'est Decl_impl<Decl>, alors
Var_impl n'en est pas un et ça me gène de ne pas pouvoir
passer des Var_impl où je veux des Decl_impl; ok, on peut
demander des Var mais ça force à mettre des choses propres à
l'implémentation dans Var (ce qui est particulièrement
génant dans les cas où j'ai des impl1/impl2 qui ont besoin
de choses différentes).

Si c'est Decl_impl<Var> c'est un Var et ça me gène aussi.

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
Gabriel Dos Reis
Jean-Marc Bourguet writes:

[...]

| > On a décidé d'éliminer ces dérivations viruelles.
| > Alors on a fait (grosso modo) :
| >
| > template<class Interface>
| > struct Expr_impl : Interface { .... };
| >
| > template<class Interface>
| > struct Decl_impl : Expr_impl<Interface> { ... };
| >
| > struct Var_impl : Decl_impl<Var> { .... };
| >
| > Du coup, on a la chaine d'heritage suivante
| >
| > Var_impl -> Decl_impl<> -> Expr_impl -> Var -> Decl -> Expr
| >
| > Ce qui nous donne la sémantique qu'on voulait au départ.
|
| C'est ce que j'avais compris. Mais c'est quoi que vous
| utilisez pour Decl_impl? Si c'est Decl_impl<Decl>, alors
| Var_impl n'en est pas un et ça me gène de ne pas pouvoir
| passer des Var_impl où je veux des Decl_impl;

Dans la chaîne d'instantiation, Decl_impl<> est Decl_impl<Var> ;
c'est la même valeur pour "Interface" qui est propagée jusqu'en "haut".

| ok, on peut
| demander des Var mais ça force à mettre des choses propres à
| l'implémentation dans Var (ce qui est particulièrement
| génant dans les cas où j'ai des impl1/impl2 qui ont besoin
| de choses différentes).

Aucune classe abstraite ne contient de données membres.
Les fonctions membres sont toutes virtuelles -- pour la plupart pure.
Si tu envisages deux implémentations différentes pour Var, il n'y a
pas de problème tant que les sémantiques de l'interface sont
respectées.

| Si c'est Decl_impl<Var> c'est un Var et ça me gène aussi.

Là, je ne te suis pas. Pourquoi cela te gêne ?
Pour la plus grande part des analyses, seules les classes interfaces
sont nécessaires -- et elles ne supportent aucune opération non-const.

Là où on a besoin des classes d'implémentation, c'est quand on
construit un graphe où on veut faire une opération non-const ; mais
dans ces cas on opère sur Var_impl et rarement sur Decl_impl<> -- de
toute façon, il n'y a pas de moyen d'avoir un Decl_impl<> par la
classe de visite.

Ai-je mal compris ta question ?

-- Gaby
1 2 3 4