Aide avec les template: comment implémenter élégamment une propriété avec getter

cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 - 5 avril 2008 à 16:20
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 - 5 avril 2008 à 18:06
Bonjour à tous,

je n'ai pas commencé le C++ depuis très longtemps donc désolé si ma question parait trop naïve. J'ai cherché à de nombreux endroits une réponse appropriée mais n'ai rien trouvé.

Voici ce que je veux réaliser: étant donnée une classe donnée (dans ce qui suit je l'appelle "window"), je voudrais la doter facilement de propriétés qui redéfinissent certains opérateur en simplifiant au maximum leur usage, que ce soit pour celui qui écrit la classe ou pour celui qui l'utilise. Le but est de définir une classe template "property" qui ressemblerait à peu près à ça:

template <class T,T Default,class U,T (U::*getter)(void),void (U::*setter)(T value)> class property {
  /* Ici redéfinition des opérateurs d'affectation et transtypage utilisant les méthodes getter et setter de la classe parent "U"  */
}

Exemple d'utilisation:

class window {
  private:
    HWND Handle;
 
  protected:
    int getWidth(void);
    void setWidth(const int width);

  public:
    property Width; /* Ici 50 c'est la valeur par défaut qui sert à initialiser la propriété */
}

Evidemment, property<T,...> redéfinirait les opérateurs d'affectation d'une valeur const T et de transtypage vers le type T,etc...  pour pouvoir utiliser le tout ainsi:

window w;
int largeur=w.width;
w.width=500;

Le principe est semblable aux déclarations de propriétés (property Width:Integer read getWidth write setWidth default 50;) de Delphi, pour ceux qui connaissent. Evidemment, les setter et getter utilisés doivent pouvoir référencer les membres privés de window puisqu'ici on souhaiterait accéser au champ Handle, par exemple avec les API SetWindowPos ou autres.

Ma question est: comment implémenter ce fameux template? Bien évidemment ce que j'ai écrit ici ne fonctionne pas, puisqu'il faudrait donner une référence à this dans les spécifications du template, ce qui n'est pas possible à ma connaissance.

Je voudrais pouvoir me dispenser d'avoir à donner des paramètres dans le constructeur de la propriété, afin de conserver les facilités d'écriture et d'utilisation des objets automatiques. Bien sûr, il serait possible de passer les méthodes de classe this->getWidth et this->setWidth au moment du constructeur de window à Width, mais là encore j'aimerais pouvoir m'en dispenser si c'est possible, de façon à ce que la définition d'une propriété puisse se faire en une ligne en utilisant judicieusement les facilités des templates. Eventuellement si c'était possible de le faire (toujours en une ligne!) avec une macro, je suis preneur aussi.

Autre piste avec macro que j'ai un peu explorée: en définissant une struct localement à l'intérieur de la classe window, il est possible de faire référence (à l'intérieur des méthodes membres de la struct) aux champs de la classe window.... à condition que ceux-ci soient static, ce qui est une sérieuse limitation! Je suis en train d'essayer de voir s'il n'est pas possible de définir une classe descendante de window à l'intérieur même de window, qui se chargerait de faire le travail.

J'espère que mes explications sont suffisamment claires. Merci d'avance à tout gourou du C++ qui pourrait m'aider, la récompense sera mon admiration éternelle de sa maîtrise du langage

2 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
5 avril 2008 à 17:50
Si tu utilises Visual C++ tu peux le faire avec __declspec(property).
explications et exemple sur MSDN :
http://msdn2.microsoft.com/en-us/library/yhfk0thd.aspx
0
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
5 avril 2008 à 18:06
Merci, je ne connaissais pas, mais d'après ce que je lis c'est spécifique à Microsoft... dommage car ça a l'air bien pratique à utiliser!

Je cherche plutôt une solution utilisant uniquement le langage C++ et pas des extensions propriétaires (c'est pour faire du code multiplateforme).
0
Rejoignez-nous