Forum Programmation.c++ Template, mes amis !

Posté par  .
Étiquettes : aucune
0
4
jan.
2011
Bonjour à tous,

Une petite question qui me taraude :
je désire faire des opérations sur des objets divers connus à la compilation, et pour ça j'utilise des template cl<T\>
Un objet parmi ceux-ci, mettons E, me sert à extirper certaines propriétés de ma classe template cl<T\>.

Dans un souci d'encapsulation, cl<\T> a des méthodes privées. cl aussi. Logique.
J'ai pourtant besoin, quand j'extrais des propriétés de cl<T\>, d'appeler des méthodes de cl<E\> qui doivent, pourtant, rester privées par ailleurs.

Je pourrais dire que toutes les classes cl<T\> sont amies les unes des autres, en déclarant
template<class T>
friend class cl { ...

Mais c'est moche, cl<T\> avec T quelconque n'a besoin d'avoir que cl<E\> comme amie, pas toutes ses cousines (on n'est pas sur facebook ici).

D'autre part, je n'ai rien à spécialiser dans cl<E\> qui me justifie de déclarer et définir ses méthodes par ailleurs : elles sont déclarées génériquement dans cl, pas très envie de dupliquer le code. À la rigueur la déclaration de la fonction, mais ça risque d'être assez pénible.

Qu'en pensez-vous ? Faut-il dupliquer toutes mes lignes de déclaration de méthodes pour cl<E\> ? Ou bien y a-t-il un design plus élégant ?

merci de vos lumières,

khivapia

PS : question subsidiaire : il y a un moyen d'échapper les < > autrement que de la façon - moche - dont je l'ai fait ?
  • # reponse subsidiaire

    Posté par  . Évalué à 2.

    pour le reste je ne sais pas mais pour la
    PS : question subsidiaire : il y a un moyen d'échapper les < > autrement que de la façon - moche - dont je l'ai fait ?

    ca marche en mettant des espaces dans les < >

    exemple < ma balise >
    ma classe < T >
    mon objet < E >
  • # En résumé

    Posté par  . Évalué à 2.

    quand on a une classe template cl< T > avec T type générique, et un type E, comment déclare-t-on proprement que cl< E > est amie avec toutes les cl< T > ?
  • # Petites précisions

    Posté par  . Évalué à 2.

    L'amitié universelle entre les classes issues d'un même template ne se fait pas par la version donnée ci-dessus, mais bien par

    template<class T>
    class cl
    {
    template friend class cl;

    ...
    };


    Et apparemment il n'est pas possible de spécialiser une instantiation particulière de la classe template, qui serait amie avec toutes les autres facilement.
    On peut jeter un œil vers http://www.developpez.net/forums/d811845/c-cpp/cpp/langage/a(...) et http://www.developpez.net/forums/d724627/c-cpp/cpp/communaut(...)

    J'aurais dû approfondir un peu plus mes recherches avant de poster...

    Cela dit si quelqu'un sait ce qu'il en est vraiment (ça n'a pas l'air si clair), et ce qu'il en sera dans la future version C++0x du langage C++ ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.