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 !

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;
}
Deux spécialisations

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>
{
...
}
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 TMachinList->IndexOf, ça compile, ça fonctionne !
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 !

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
...
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 TBidule : public TObject
{
 // Rien !
}
 
class TBiduleList : public TShaiList<TBidule> // Compile pas TBidule n'est pas un TComparableObjet 
{
...
}

mais accepte ça évidemment

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>
{
...
}
Est-ce déjà ma question est pertinente ?
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 ?