template de déclaration d'un copy-constructeur en friend (combo \o/)

template de déclaration d'un copy-constructeur en friend (combo \o/) - C++ - Programmation

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) :

Code :
  1. class Foo {
  2.  private:
  3.  template <typename U> friend U::U(const U& );
  4.  int secret;
  5. };


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.
Reply

Marsh Posté le 24-02-2009 à 16:45:34   

Reply

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
 

Reply

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).

Message cité 2 fois
Message édité par Un Programmeur le 24-02-2009 à 17:04:41
Reply

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.

Reply

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 :jap:
 


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

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 :
  1. class A{
  2.    template<class B> friend int j();
  3. };


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...

Message cité 1 fois
Message édité par Xavier_OM le 24-02-2009 à 17:48:06

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

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 :/

Reply

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 ;)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 24-02-2009 à 21:00:38    

Xavier_OM a écrit :


 

Code :
  1. class A{
  2.    template<class B> friend int j();
  3. };


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  :??:


 
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.

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed