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écialisationsCode:
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:
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:
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 contreCode:
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:
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:
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 ?