Je voudrais définir une classe virtuelle
(comme interface pour le polymorphisme) A, qui possède une
méthode de "croisement" (pour un algo G) genre
A::CroiseAvec(const A&), de manière à ce que quand j'en dérive
mes classes concrètes, j'aie automatiquement (ou pas, mais que
ça soit transparent pour un pointeur sur un A) pour B (dérivée
de A) une méthode B::CroiseAvec(const B&).
Je pourrais garder const A& en paramètre, mais ce ne serait
pas sûr côté vérif de type, ça permettrait si C est une autre
sous classe de A à un imprudent de faire B::CroiseAvec(C), ce
que je voudrais éviter.
En somme, comment dire qu'on veut, pour paramètre d'une
méthode, quelque chose du même type que this, lors de la
déclaration de la classe abstraite (ou interface) ?
Je voudrais définir une classe virtuelle
(comme interface pour le polymorphisme) A, qui possède une
méthode de "croisement" (pour un algo G) genre
A::CroiseAvec(const A&), de manière à ce que quand j'en dérive
mes classes concrètes, j'aie automatiquement (ou pas, mais que
ça soit transparent pour un pointeur sur un A) pour B (dérivée
de A) une méthode B::CroiseAvec(const B&).
Je pourrais garder const A& en paramètre, mais ce ne serait
pas sûr côté vérif de type, ça permettrait si C est une autre
sous classe de A à un imprudent de faire B::CroiseAvec(C), ce
que je voudrais éviter.
En somme, comment dire qu'on veut, pour paramètre d'une
méthode, quelque chose du même type que this, lors de la
déclaration de la classe abstraite (ou interface) ?
Je voudrais définir une classe virtuelle
(comme interface pour le polymorphisme) A, qui possède une
méthode de "croisement" (pour un algo G) genre
A::CroiseAvec(const A&), de manière à ce que quand j'en dérive
mes classes concrètes, j'aie automatiquement (ou pas, mais que
ça soit transparent pour un pointeur sur un A) pour B (dérivée
de A) une méthode B::CroiseAvec(const B&).
Je pourrais garder const A& en paramètre, mais ce ne serait
pas sûr côté vérif de type, ça permettrait si C est une autre
sous classe de A à un imprudent de faire B::CroiseAvec(C), ce
que je voudrais éviter.
En somme, comment dire qu'on veut, pour paramètre d'une
méthode, quelque chose du même type que this, lors de la
déclaration de la classe abstraite (ou interface) ?
Je voudrais définir une classe virtuelle (comme interface pour le
polymorphisme) A, qui possède une méthode de "croisement" (pour un
algo G) genre A::CroiseAvec(const A&), de manière à ce que quand j'en
dérive mes classes concrètes, j'aie automatiquement (ou pas, mais que
ça soit transparent pour un pointeur sur un A) pour B (dérivée de A)
une méthode B::CroiseAvec(const B&). Je pourrais garder const A& en
paramètre, mais ce ne serait pas sûr côté vérif de type, ça
permettrait si C est une autre sous classe de A à un imprudent de
faire B::CroiseAvec(C), ce que je voudrais éviter.
En somme, comment dire qu'on veut, pour paramètre d'une méthode,
quelque chose du même type que this, lors de la déclaration de la
classe abstraite (ou interface) ?
Je voudrais définir une classe virtuelle (comme interface pour le
polymorphisme) A, qui possède une méthode de "croisement" (pour un
algo G) genre A::CroiseAvec(const A&), de manière à ce que quand j'en
dérive mes classes concrètes, j'aie automatiquement (ou pas, mais que
ça soit transparent pour un pointeur sur un A) pour B (dérivée de A)
une méthode B::CroiseAvec(const B&). Je pourrais garder const A& en
paramètre, mais ce ne serait pas sûr côté vérif de type, ça
permettrait si C est une autre sous classe de A à un imprudent de
faire B::CroiseAvec(C), ce que je voudrais éviter.
En somme, comment dire qu'on veut, pour paramètre d'une méthode,
quelque chose du même type que this, lors de la déclaration de la
classe abstraite (ou interface) ?
Je voudrais définir une classe virtuelle (comme interface pour le
polymorphisme) A, qui possède une méthode de "croisement" (pour un
algo G) genre A::CroiseAvec(const A&), de manière à ce que quand j'en
dérive mes classes concrètes, j'aie automatiquement (ou pas, mais que
ça soit transparent pour un pointeur sur un A) pour B (dérivée de A)
une méthode B::CroiseAvec(const B&). Je pourrais garder const A& en
paramètre, mais ce ne serait pas sûr côté vérif de type, ça
permettrait si C est une autre sous classe de A à un imprudent de
faire B::CroiseAvec(C), ce que je voudrais éviter.
En somme, comment dire qu'on veut, pour paramètre d'une méthode,
quelque chose du même type que this, lors de la déclaration de la
classe abstraite (ou interface) ?
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage sous mon
VC6) ne me plaît pas parce qu'elle ne traduit pas de responsabilité,
La surcharge de croiseAvec() avec un autre type me gène, car si je
fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part). Ce sera
IIndividu::croiseAvec qui sera appelé, & non Individu::croiseAvec. Par
ailleurs si j'implémente un croiseAvec(IIndividu&) et un
croiseAvec(Individu&), il y aura conflit, les deux acceptant un
Individu.
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage sous mon
VC6) ne me plaît pas parce qu'elle ne traduit pas de responsabilité,
La surcharge de croiseAvec() avec un autre type me gène, car si je
fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part). Ce sera
IIndividu::croiseAvec qui sera appelé, & non Individu::croiseAvec. Par
ailleurs si j'implémente un croiseAvec(IIndividu&) et un
croiseAvec(Individu&), il y aura conflit, les deux acceptant un
Individu.
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage sous mon
VC6) ne me plaît pas parce qu'elle ne traduit pas de responsabilité,
La surcharge de croiseAvec() avec un autre type me gène, car si je
fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part). Ce sera
IIndividu::croiseAvec qui sera appelé, & non Individu::croiseAvec. Par
ailleurs si j'implémente un croiseAvec(IIndividu&) et un
croiseAvec(Individu&), il y aura conflit, les deux acceptant un
Individu.
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage
sous mon VC6) ne me plaît pas parce qu'elle ne traduit pas de
responsabilité, c'est juste une sécurité, comme un assert().
De même pour le test sur un dynamic_cast.
La surcharge de croiseAvec() avec un autre type me gène, car
si je fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part).
Ce sera IIndividu::croiseAvec qui sera appelé, & non
Individu::croiseAvec. Par ailleurs si j'implémente un
croiseAvec(IIndividu&) et un croiseAvec(Individu&), il y aura
conflit, les deux acceptant un Individu.
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne veux
pas décentraliser la fonction de croisement, au contraire.
Quant au sélecteur, je n'ai pas encore saisi s'il était
applicable ou non à mon cas. Est-ce impossible à cause de la
vérif dynamique de type ?
En espérant avoir été plus clair
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage
sous mon VC6) ne me plaît pas parce qu'elle ne traduit pas de
responsabilité, c'est juste une sécurité, comme un assert().
De même pour le test sur un dynamic_cast.
La surcharge de croiseAvec() avec un autre type me gène, car
si je fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part).
Ce sera IIndividu::croiseAvec qui sera appelé, & non
Individu::croiseAvec. Par ailleurs si j'implémente un
croiseAvec(IIndividu&) et un croiseAvec(Individu&), il y aura
conflit, les deux acceptant un Individu.
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne veux
pas décentraliser la fonction de croisement, au contraire.
Quant au sélecteur, je n'ai pas encore saisi s'il était
applicable ou non à mon cas. Est-ce impossible à cause de la
vérif dynamique de type ?
En espérant avoir été plus clair
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage
sous mon VC6) ne me plaît pas parce qu'elle ne traduit pas de
responsabilité, c'est juste une sécurité, comme un assert().
De même pour le test sur un dynamic_cast.
La surcharge de croiseAvec() avec un autre type me gène, car
si je fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part).
Ce sera IIndividu::croiseAvec qui sera appelé, & non
Individu::croiseAvec. Par ailleurs si j'implémente un
croiseAvec(IIndividu&) et un croiseAvec(Individu&), il y aura
conflit, les deux acceptant un Individu.
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne veux
pas décentraliser la fonction de croisement, au contraire.
Quant au sélecteur, je n'ai pas encore saisi s'il était
applicable ou non à mon cas. Est-ce impossible à cause de la
vérif dynamique de type ?
En espérant avoir été plus clair
Vivien Parlat wrote:
[...]C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage
sous mon VC6) ne me plaît pas parce qu'elle ne traduit pas de
responsabilité, c'est juste une sécurité, comme un assert().
De même pour le test sur un dynamic_cast.
Ou bien, tu connais le type lors de la compilation, et tu
traites avec ce type, et il n'y a pas de problème, le
compilateur fait toutes les vérifications nécessaire. Ou bien,
tu ne le connais pas, et il faut que tu sois en mesure de faire
des vérifications dynamiques.
La surcharge de croiseAvec() avec un autre type me gène, car
si je fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part).
Est-ce que tu veux le polymorphisme, ou est-ce que tu ne le veux
pas ? Si tu le veux, il faut que tu puisses traiter le cas où
IIndividu n'a pas le bon type dynamique, à l'exécution. Si tu ne
le veux pas, je ne vois pas où est le problème en ce que chaque
classe dérivée a sa propre fonction.
Ce sera IIndividu::croiseAvec qui sera appelé, & non
Individu::croiseAvec. Par ailleurs si j'implémente un
croiseAvec(IIndividu&) et un croiseAvec(Individu&), il y aura
conflit, les deux acceptant un Individu.
D'abord, je ne vois croiseAvec(Base&) que dans la classe de
base. Et je ne le vois pas virtuelle, mais qu'il appelle une
fonction virtuelle privée. Du genre :
class Base
{
public:
ErrorCode croiseAvec( Base& autre )
{
// Mais on pourrait très bien aussi laisser
// la décision si c'est légal à la classe
// dérivée. Question de conception.
return typeid( autre ) == typeid( *this )
? doCroiseAvec( autre )
: illegalTypeError ;
}
private:
virtual ErrorCode doCroiseAvec( Base& autre ) = 0 ;
} ;
class Derived : public Base
{
public:
ErrorCode croiseAvec( Derived& autre ) ;
private:
ErrorCode doCroiseAvec( Base& autre )
{
assert( typeid( *this ) == typeid( autre ) ) ;
return croiseAvec( static_cast< Derived& >( autre )) ;
}
} ;
Du coup, si tu connais le type (et donc, que tu as un Derived*
ou un Derived&), tu va appeler Derived::croiseAvec directement,
et si tu essaies d'appeler croiseAvec avec un autre type, le
compilateur se plaint. Et si tu ne connais pas le type, c'est
qu'il risque de varier lors de l'exécution, et tu ne peux
effectuer les vérifications qu'à l'exécution.
Et en passant, il n'y a aucun problème avec deux fonctions du
même nom qui prend des paramètres des types différents. Les
règles de résolution du surcharge entre en jeux -- en
particulier, on va préférer la fonction qui correspond
exactement à celle qui exige une conversion Derived& vers Base&.
(Mais ça n'entre pas en jeu ici, parce qu'il n'y a jamais qu'une
croiseAvec en jeux.)
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne veux
pas décentraliser la fonction de croisement, au contraire.
Dans ce cas-ci, je ne crois pas non plus qu'il soit nécessaire.
Dans le cas général, en revanche... Le C++ n'a pas de double
dispatch au niveau du langage, et le modèle visiteur est sans
doute la façon la plus simple à le simuler.
Quant au sélecteur, je n'ai pas encore saisi s'il était
applicable ou non à mon cas. Est-ce impossible à cause de la
vérif dynamique de type ?
Je n'ai toujours pas bien saisi si tu sais le type réel lors de
la compilation ou non.
Moi oui, AlgoG manipule une interface (pour ce qui est prévu du
Vivien Parlat wrote:
[...]
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage
sous mon VC6) ne me plaît pas parce qu'elle ne traduit pas de
responsabilité, c'est juste une sécurité, comme un assert().
De même pour le test sur un dynamic_cast.
Ou bien, tu connais le type lors de la compilation, et tu
traites avec ce type, et il n'y a pas de problème, le
compilateur fait toutes les vérifications nécessaire. Ou bien,
tu ne le connais pas, et il faut que tu sois en mesure de faire
des vérifications dynamiques.
La surcharge de croiseAvec() avec un autre type me gène, car
si je fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part).
Est-ce que tu veux le polymorphisme, ou est-ce que tu ne le veux
pas ? Si tu le veux, il faut que tu puisses traiter le cas où
IIndividu n'a pas le bon type dynamique, à l'exécution. Si tu ne
le veux pas, je ne vois pas où est le problème en ce que chaque
classe dérivée a sa propre fonction.
Ce sera IIndividu::croiseAvec qui sera appelé, & non
Individu::croiseAvec. Par ailleurs si j'implémente un
croiseAvec(IIndividu&) et un croiseAvec(Individu&), il y aura
conflit, les deux acceptant un Individu.
D'abord, je ne vois croiseAvec(Base&) que dans la classe de
base. Et je ne le vois pas virtuelle, mais qu'il appelle une
fonction virtuelle privée. Du genre :
class Base
{
public:
ErrorCode croiseAvec( Base& autre )
{
// Mais on pourrait très bien aussi laisser
// la décision si c'est légal à la classe
// dérivée. Question de conception.
return typeid( autre ) == typeid( *this )
? doCroiseAvec( autre )
: illegalTypeError ;
}
private:
virtual ErrorCode doCroiseAvec( Base& autre ) = 0 ;
} ;
class Derived : public Base
{
public:
ErrorCode croiseAvec( Derived& autre ) ;
private:
ErrorCode doCroiseAvec( Base& autre )
{
assert( typeid( *this ) == typeid( autre ) ) ;
return croiseAvec( static_cast< Derived& >( autre )) ;
}
} ;
Du coup, si tu connais le type (et donc, que tu as un Derived*
ou un Derived&), tu va appeler Derived::croiseAvec directement,
et si tu essaies d'appeler croiseAvec avec un autre type, le
compilateur se plaint. Et si tu ne connais pas le type, c'est
qu'il risque de varier lors de l'exécution, et tu ne peux
effectuer les vérifications qu'à l'exécution.
Et en passant, il n'y a aucun problème avec deux fonctions du
même nom qui prend des paramètres des types différents. Les
règles de résolution du surcharge entre en jeux -- en
particulier, on va préférer la fonction qui correspond
exactement à celle qui exige une conversion Derived& vers Base&.
(Mais ça n'entre pas en jeu ici, parce qu'il n'y a jamais qu'une
croiseAvec en jeux.)
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne veux
pas décentraliser la fonction de croisement, au contraire.
Dans ce cas-ci, je ne crois pas non plus qu'il soit nécessaire.
Dans le cas général, en revanche... Le C++ n'a pas de double
dispatch au niveau du langage, et le modèle visiteur est sans
doute la façon la plus simple à le simuler.
Quant au sélecteur, je n'ai pas encore saisi s'il était
applicable ou non à mon cas. Est-ce impossible à cause de la
vérif dynamique de type ?
Je n'ai toujours pas bien saisi si tu sais le type réel lors de
la compilation ou non.
Moi oui, AlgoG manipule une interface (pour ce qui est prévu du
Vivien Parlat wrote:
[...]C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage
sous mon VC6) ne me plaît pas parce qu'elle ne traduit pas de
responsabilité, c'est juste une sécurité, comme un assert().
De même pour le test sur un dynamic_cast.
Ou bien, tu connais le type lors de la compilation, et tu
traites avec ce type, et il n'y a pas de problème, le
compilateur fait toutes les vérifications nécessaire. Ou bien,
tu ne le connais pas, et il faut que tu sois en mesure de faire
des vérifications dynamiques.
La surcharge de croiseAvec() avec un autre type me gène, car
si je fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part).
Est-ce que tu veux le polymorphisme, ou est-ce que tu ne le veux
pas ? Si tu le veux, il faut que tu puisses traiter le cas où
IIndividu n'a pas le bon type dynamique, à l'exécution. Si tu ne
le veux pas, je ne vois pas où est le problème en ce que chaque
classe dérivée a sa propre fonction.
Ce sera IIndividu::croiseAvec qui sera appelé, & non
Individu::croiseAvec. Par ailleurs si j'implémente un
croiseAvec(IIndividu&) et un croiseAvec(Individu&), il y aura
conflit, les deux acceptant un Individu.
D'abord, je ne vois croiseAvec(Base&) que dans la classe de
base. Et je ne le vois pas virtuelle, mais qu'il appelle une
fonction virtuelle privée. Du genre :
class Base
{
public:
ErrorCode croiseAvec( Base& autre )
{
// Mais on pourrait très bien aussi laisser
// la décision si c'est légal à la classe
// dérivée. Question de conception.
return typeid( autre ) == typeid( *this )
? doCroiseAvec( autre )
: illegalTypeError ;
}
private:
virtual ErrorCode doCroiseAvec( Base& autre ) = 0 ;
} ;
class Derived : public Base
{
public:
ErrorCode croiseAvec( Derived& autre ) ;
private:
ErrorCode doCroiseAvec( Base& autre )
{
assert( typeid( *this ) == typeid( autre ) ) ;
return croiseAvec( static_cast< Derived& >( autre )) ;
}
} ;
Du coup, si tu connais le type (et donc, que tu as un Derived*
ou un Derived&), tu va appeler Derived::croiseAvec directement,
et si tu essaies d'appeler croiseAvec avec un autre type, le
compilateur se plaint. Et si tu ne connais pas le type, c'est
qu'il risque de varier lors de l'exécution, et tu ne peux
effectuer les vérifications qu'à l'exécution.
Et en passant, il n'y a aucun problème avec deux fonctions du
même nom qui prend des paramètres des types différents. Les
règles de résolution du surcharge entre en jeux -- en
particulier, on va préférer la fonction qui correspond
exactement à celle qui exige une conversion Derived& vers Base&.
(Mais ça n'entre pas en jeu ici, parce qu'il n'y a jamais qu'une
croiseAvec en jeux.)
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne veux
pas décentraliser la fonction de croisement, au contraire.
Dans ce cas-ci, je ne crois pas non plus qu'il soit nécessaire.
Dans le cas général, en revanche... Le C++ n'a pas de double
dispatch au niveau du langage, et le modèle visiteur est sans
doute la façon la plus simple à le simuler.
Quant au sélecteur, je n'ai pas encore saisi s'il était
applicable ou non à mon cas. Est-ce impossible à cause de la
vérif dynamique de type ?
Je n'ai toujours pas bien saisi si tu sais le type réel lors de
la compilation ou non.
Moi oui, AlgoG manipule une interface (pour ce qui est prévu du
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage sous m on
VC6) ne me plaît pas parce qu'elle ne traduit pas de responsabilité,
Je ne comprends pas trop ce que tu veux dire ici.
La surcharge de croiseAvec() avec un autre type me gène, car si je
fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part). Ce sera
IIndividu::croiseAvec qui sera appelé, & non Individu::croiseAvec. Par
ailleurs si j'implémente un croiseAvec(IIndividu&) et un
croiseAvec(Individu&), il y aura conflit, les deux acceptant un
Individu.
Si j'ai bien compris, tu veux des fonctions virtuelles par rapport à 2
arguments bool estFertile(IIndividu , IIndividu). Ce n'est pas possible
directement en C++. Il y a des approximations. Si tu as accès à More
effective C++, l'item 31 parle de ce sujet.
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage sous m on
VC6) ne me plaît pas parce qu'elle ne traduit pas de responsabilité,
Je ne comprends pas trop ce que tu veux dire ici.
La surcharge de croiseAvec() avec un autre type me gène, car si je
fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part). Ce sera
IIndividu::croiseAvec qui sera appelé, & non Individu::croiseAvec. Par
ailleurs si j'implémente un croiseAvec(IIndividu&) et un
croiseAvec(Individu&), il y aura conflit, les deux acceptant un
Individu.
Si j'ai bien compris, tu veux des fonctions virtuelles par rapport à 2
arguments bool estFertile(IIndividu , IIndividu). Ce n'est pas possible
directement en C++. Il y a des approximations. Si tu as accès à More
effective C++, l'item 31 parle de ce sujet.
C'est "de la même espèce" qui pose problème; la solution
"typeid(truc)==typeid(*this)" (qui ne compile pas au passage sous m on
VC6) ne me plaît pas parce qu'elle ne traduit pas de responsabilité,
Je ne comprends pas trop ce que tu veux dire ici.
La surcharge de croiseAvec() avec un autre type me gène, car si je
fais:
IIndividu* iind = &indiv;
iind->croiseAvec(untel);
la liaison tardive n'aura pas lieu (sauf erreur de ma part). Ce sera
IIndividu::croiseAvec qui sera appelé, & non Individu::croiseAvec. Par
ailleurs si j'implémente un croiseAvec(IIndividu&) et un
croiseAvec(Individu&), il y aura conflit, les deux acceptant un
Individu.
Si j'ai bien compris, tu veux des fonctions virtuelles par rapport à 2
arguments bool estFertile(IIndividu , IIndividu). Ce n'est pas possible
directement en C++. Il y a des approximations. Si tu as accès à More
effective C++, l'item 31 parle de ce sujet.
Je pense que je vais adopter ta solution, une fois résolu le pbm de
l'égalité entre typeid; si j'ai bien compris typeid demande de faire
appel à l'option RTTI (dans VC). Est-ce que le source reste portable,
ie est-ce que tous les compilos l'accepteront ?
Je pense que je vais adopter ta solution, une fois résolu le pbm de
l'égalité entre typeid; si j'ai bien compris typeid demande de faire
appel à l'option RTTI (dans VC). Est-ce que le source reste portable,
ie est-ce que tous les compilos l'accepteront ?
Je pense que je vais adopter ta solution, une fois résolu le pbm de
l'égalité entre typeid; si j'ai bien compris typeid demande de faire
appel à l'option RTTI (dans VC). Est-ce que le source reste portable,
ie est-ce que tous les compilos l'accepteront ?
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne
veux pas décentraliser la fonction de croisement, au
contraire.
Dans ce cas-ci, je ne crois pas non plus qu'il soit
nécessaire. Dans le cas général, en revanche... Le C++ n'a
pas de double dispatch au niveau du langage, et le modèle
visiteur est sans doute la façon la plus simple à le
simuler.
Je ne connais pas le double dispatch. Est-ce que ça permet
d'écrire qqch genre "(A,B).croiseAvec() (qui se traduirait par
deux références cachées à la compil contre une en temps
normal) ? Dans l'idéal j'aurais aimé pouvoir écrire ce genre
de choses, même si je ne sais pas si c possible.
Je pense que je vais adopter ta solution, une fois résolu le
pbm de l'égalité entre typeid; si j'ai bien compris typeid
demande de faire appel à l'option RTTI (dans VC). Est-ce que
le source reste portable, ie est-ce que tous les compilos
l'accepteront ?
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne
veux pas décentraliser la fonction de croisement, au
contraire.
Dans ce cas-ci, je ne crois pas non plus qu'il soit
nécessaire. Dans le cas général, en revanche... Le C++ n'a
pas de double dispatch au niveau du langage, et le modèle
visiteur est sans doute la façon la plus simple à le
simuler.
Je ne connais pas le double dispatch. Est-ce que ça permet
d'écrire qqch genre "(A,B).croiseAvec() (qui se traduirait par
deux références cachées à la compil contre une en temps
normal) ? Dans l'idéal j'aurais aimé pouvoir écrire ce genre
de choses, même si je ne sais pas si c possible.
Je pense que je vais adopter ta solution, une fois résolu le
pbm de l'égalité entre typeid; si j'ai bien compris typeid
demande de faire appel à l'option RTTI (dans VC). Est-ce que
le source reste portable, ie est-ce que tous les compilos
l'accepteront ?
Enfin, par rapport à l'autre fil de discussion indiqué par
Fabien LE LEZ, le pattern Visitor ne m'inspire pas, je ne
veux pas décentraliser la fonction de croisement, au
contraire.
Dans ce cas-ci, je ne crois pas non plus qu'il soit
nécessaire. Dans le cas général, en revanche... Le C++ n'a
pas de double dispatch au niveau du langage, et le modèle
visiteur est sans doute la façon la plus simple à le
simuler.
Je ne connais pas le double dispatch. Est-ce que ça permet
d'écrire qqch genre "(A,B).croiseAvec() (qui se traduirait par
deux références cachées à la compil contre une en temps
normal) ? Dans l'idéal j'aurais aimé pouvoir écrire ce genre
de choses, même si je ne sais pas si c possible.
Je pense que je vais adopter ta solution, une fois résolu le
pbm de l'égalité entre typeid; si j'ai bien compris typeid
demande de faire appel à l'option RTTI (dans VC). Est-ce que
le source reste portable, ie est-ce que tous les compilos
l'accepteront ?