Et si on écrivaitCitation:
Et J = I + I + F ?
(-> rajouter les const qui manquent)
l'operator+() additionne I et I et ensuite F et stocke à l'aide de operator=() dans J.Citation:
J = (I + I) + F?
Gabrielly :D
Version imprimable
Et si on écrivaitCitation:
Et J = I + I + F ?
(-> rajouter les const qui manquent)
l'operator+() additionne I et I et ensuite F et stocke à l'aide de operator=() dans J.Citation:
J = (I + I) + F?
Gabrielly :D
Arf. Je n'avais pas fait attention à l'opérateur de convertion qui fait en sorte que I + J + K additionne des int et non leur proxies.
Ce qui rejoint mon idée (non formulée) première que le proxy ne doit rien contenir d'autre que des indirections sur des set & get.
Ces opérateurs mathématiques ne servent à rien.
Luc Hermitte a écrit:
Aurelien.Regat-Barrel a écrit la classe en premier. Et j'étais content car j'avais la même idée celle de définir une classe template Property. Je l'ai juste perfectionné un peu avec suffisamment de méthodes d'opérateur surdéfinis pour permettre à 10_GOTO_10 à ne pas trop récrire tous son code. Et d'ailleurs Property recoit dans le contexte courant des types primitifs. Juste pour être plus prêts des besoins de 10_GOTO_10. Mais ces quelques postes sont intéressants car les solutions que l'on peut en tirer de C++ sont multiples ie les tiennent comme les miennes alors faisons simplement une union des solutions. Les opérateurs mathématiques simplifient la syntaxe, tu ne trouves pas? Les pointeurs intelligents les utilisent énormément (ATL). Ceux qui nous lisent veront combien la marge de manoeuvre de ce langage est grand. :wink:Citation:
Arf. Je n'avais pas fait attention à l'opérateur de convertion qui fait en sorte que I + J + K additionne des int et non leur proxies.
Ce qui rejoint mon idée (non formulée) première que le proxy ne doit rien contenir d'autre que des indirections sur des set & get.
Ces opérateurs mathématiques ne servent à rien.
Gabrielly :D
Merci à vous tous. Même si j'ai pas de solution parfaite, j'ai néanmoins pas mal progressé. Pour info, voici la solution que je pense adopter:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 const WORD PROPERTY_READVAR = 0x0001; const WORD PROPERTY_READFONC = 0x0002; const WORD PROPERTY_WRITEVAR = 0x0004; const WORD PROPERTY_WRITEFONC = 0x0008; template<class O, typename T> class Property { private: O * Owner; WORD TypeInit; union { T * Read_t; T (O::* Get_t) (); }; union { T * Write_t; bool (O::* Set_t) (const T t); }; public: Property() { Owner = NULL; TypeInit = 0; Read_t = NULL; Write_t = NULL; } void InitProperty(O * NewOwner, T * NewRead_t, T * NewWrite_t) { Owner = NewOwner; TypeInit = PROPERTY_READVAR | PROPERTY_WRITEVAR; Read_t = NewRead_t; Write_t = NewWrite_t; } void InitProperty(O * NewOwner, T (O::* NewGet_t) (), T * NewWrite_t) { Owner = NewOwner; TypeInit = PROPERTY_READFONC | PROPERTY_WRITEVAR; Write_t = NewWrite_t; Get_t = NewGet_t; } void InitProperty(O * NewOwner, T * NewRead_t, bool (O::* NewSet_t) (const T t)) { Owner = NewOwner; TypeInit = PROPERTY_READVAR | PROPERTY_WRITEFONC; Read_t = NewRead_t; Set_t = NewSet_t; } void InitProperty(O * NewOwner, T (O::* NewGet_t) (), bool (O::* NewSet_t) (const T t)) { Owner = NewOwner; TypeInit = PROPERTY_READFONC | PROPERTY_WRITEFONC; Get_t = NewGet_t; Set_t = NewSet_t; } operator T() { if (TypeInit & PROPERTY_READVAR) return * this->Read_t; if (TypeInit & PROPERTY_READFONC) return (Owner->*Get_t)(); return 0; } T operator=( const T t ) { if (TypeInit & PROPERTY_WRITEVAR) * this->Write_t = t; if (TypeInit & PROPERTY_WRITEFONC) (Owner->*Set_t)(t); return T(); } };
Puis, dans le constructeur de MyClasse:Code:
1
2
3
4
5
6
7
8
9
10 class TMyClasse { private: int FMyAttr; int GetMyAttr(); bool SetMyAttr(const int NewAttr); public: Property<TMyClasse, int> MyAttr; };
ou bienCode:MyAttr.InitProperty(this, GetMyAttr, SetMyAttr);
Code:MyAttr.InitProperty(this, &FMyAttr, &FMyAttr);
Tu n'as pas été voir sur http://groups.yahoo.com/group/boost/files/ (s'inscrire à la ML pour accéder à cette zone). J'y vois 3 implémentations de la bête.