template de déclaration d'un copy-constructeur en friend (combo \o/) - C++ - Programmation
Marsh Posté le 24-02-2009 à 16:48:07
wow, je pense plutot que c'ets pas trivial voire même pas gèrer
Je sors mon tas d'astuce et je reviens avec un verdict
Marsh Posté le 24-02-2009 à 17:04:00
Impossible. On ne templatise pas une déclaration d'ami, on déclare comme ami un template (ou une instantiation, ou une fonction non template; l'erreur classique étant de vouloir déclarer comme friend une instantiation de template et de se retrouver à déclarer comme friend une fonction de même nom de mêmes paramètres, mais qui n'est pas template).
Marsh Posté le 24-02-2009 à 17:15:05
le plus approchant serait de creer une methode public de F qui prend une ref non-const vers un type quelconque e utilisez la SFINAE pr éliminer les types qui n'ont pas le droit de 'lappeler en les reroutant vers une méthode d emême nom privée.
Marsh Posté le 24-02-2009 à 17:22:01
Un Programmeur a écrit : Impossible. On ne templatise pas une déclaration d'ami, on déclare comme ami un template (ou une instantiation, ou une fonction non template; l'erreur classique étant de vouloir déclarer comme friend une instantiation de template et de se retrouver à déclarer comme friend une fonction de même nom de mêmes paramètres, mais qui n'est pas template). |
Fichtre, bon ben tant pis, jvais laisser ça en public et me débrouiller ajouter un check au runtime au cas ou
Joel F a écrit : le plus approchant serait de creer une methode public de F qui prend une ref non-const vers un type quelconque e utilisez la SFINAE pr éliminer les types qui n'ont pas le droit de 'lappeler en les reroutant vers une méthode d emême nom privée. |
Le pb c'est que la limite de typage c'est qu'un bonus, la plus importante pour moi c'est la limitation aux copy-constructeurs.
Merci pour les réponses
Marsh Posté le 24-02-2009 à 17:45:43
Un Programmeur a écrit : Impossible. On ne templatise pas une déclaration d'ami, on déclare comme ami un template |
Code :
|
from ( http://publib.boulder.ibm.com/info [...] plates.htm )
J'ai pas fait de C++ depuis un certain temps, mais là on templatise un ami non
edit : http://www.parashift.com/c++-faq-l [...] #faq-35.16 je sais pas si ça aide mais si c'est pas dans cette faq c'est mal barré en tout cas...
Marsh Posté le 24-02-2009 à 19:57:49
si je voulasi faire mon nazi, je te dirais bien que les friends de toutes façon
Marsh Posté le 24-02-2009 à 20:13:09
Ah bah clairement, si j'ai eu besoin de ça à la base c'est pour faire un truc un poil dégueulasse, c'est pas au milieu d'un beau design objet que je suis tombé dessus
Marsh Posté le 24-02-2009 à 21:00:38
Xavier_OM a écrit :
|
Ce que j'entendais par templatiser la déclaration d'ami n'est apparemment
pas clair.
Ici, tu déclares une fonction template comme amie (ou si tu préfères,
toutes les spécialisations de cette fonction templat; cette dernière
formulation a l'avantage de rendre clair le fait que même si la
spécialisation est explicite, elle est amie).
Si on pouvait faire ce que j'entendais par templatiser la déclaration
d'ami, on arriverait à quelque chose de plus proche de ce que désirait
0x90, pouvoir en une déclaration rendre amie toute une famille de
fonctions non templates. Si en plus les constructeurs de copie étaient
valides, 0x90 avait sa solution; sinon on avait au moins un point par où
aborder le problème pour un contournement plus ou moins efficace. Mais on
n'en a pas.
Je m'en soucie pas beaucoup, j'ai beaucoup de mal à voir à quoi ça peut
servir dans une conception sensée.
Marsh Posté le 24-02-2009 à 22:08:05
0x90 a écrit : Ah bah clairement, si j'ai eu besoin de ça à la base c'est pour faire un truc un poil dégueulasse, c'est pas au milieu d'un beau design objet que je suis tombé dessus |
Ca je veux bien te crorie :E
Marsh Posté le 24-02-2009 à 16:45:34
J'ai une class Foo, avec des membres privées.
Je veut donner un accès aux membre privés à tout les constructeurs par copie (et uniquement à ceux-ci).
En gros un truc dans cet esprit là (sauf que ça compile pas tel quel) :
Bonus point si en plus je peut constraindre un super-type sur U, et là je manque totalement d'idée pour le coup.
J'ai essayé des permutations classiques de typename ou template un peu partout dans la declaration, j'ai essayé de suivre la bnf de c++, rien de concluant pour le moment
---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.