C++ Builder 2007
Pas encore de TList<> générique disponible, en plus, j'ai cru lire que le générique Delphi utilisée comme template C++, cela n'était pas le top .. si quelqu'un à retour la dessus, est-il possible en 2009 ou XE, d'écire TList<MonTypeCPPAMoi>
Car, dans la Doc "Si le code C++ tente d'utiliser un générique Delphi pour les types qui n'étaient pas instanciés dans Delphi, vous obtiendrez des erreurs lors de la liaison." est inquiétant
Donc, C++ Builder 2007, je me lance dans les templates, en Delphi 7, cela n'existe pas, je découvre et un gros problème se pose
Exemple une TObjetList où l'on est pas obligé de transtyper tout le temps !
Deux spécialisations
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 template<class T> class TShaiList : public TObjectList { public: // Opérateurs Publiques T* operator[](int Index) { return Items[Index]; } // Cache TObjectList[] protected: // Accesseurs T* __fastcall GetItem(int Index) {return (T*)inherited::Items[Index];} public: // Méthodes Protégées int IndexOf(T* Obj); // Propriétés Publiques __property T* Items[int Index] = {read=GetItem}; // default [] }; template<class T> int TShaiList<T>::IndexOf(T* Obj) { for (int i = 0; i < Count; i++) { if (Items[i]->IsEquals(Obj)) return i; } return -1; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class TBidule : public TObject { // Rien ! } class TBiduleList : public TShaiList<TBidule> { ... }Si l'on utilise TMachinList->IndexOf, ça compile, ça fonctionne !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class TMachin : public TObject { public bool IsEquals(TMachin *Obj); } class TMachinList : public TShaiList<TMachin> { ... }
Si l'on utilise TBiduleList ->IndexOf, ça compile pas ! forcément IsEquals ne fait pas parti de TBidule
En fait, le template, il faut le coder à l'aveugle et ne surtout rien supposer de T
Dans mon vrai projet, j'ai donc déplacé IndexOf de TShaiList vers TMachinList , là où je sais que IsEquals existe !
Existe-il un moyen pour que T hérite d'une classe ?
Exemple de code que je voudrais qui n'existe pas !
Et que le compilateur protège contre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class TComparableObjet { virtual IsEquals(TComparableObjet*Obj) = 0; // abstract } template<class T : public TComparableObjet> class TShaiList : public TObjectList ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class TBidule : public TObject { // Rien ! } class TBiduleList : public TShaiList<TBidule> // Compile pas TBidule n'est pas un TComparableObjet { ... }
mais accepte ça évidemment
Est-ce déjà ma question est pertinente ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class TMachin : public TComparableObjet { public bool IsEquals(TMachin *Obj); // override; } class TMachinList : public TShaiList<TMachin> { ... }
En fait je veux une générique limité à une branche d'objet !
J'ai vu que l'on pouvait utiliser les typedef pour limiter le typename !
Je n'ai pas bien compris la syntaxe d'ailleurs ?
Partager