Boaf, il suffit de faire 2 templates, et d'en passer l'un à l'autre. Un exemple de 3 templates imbriqués:
Code :
- std::vector<std::pair<int,std::string> >
|
.
Un exemple plus ou moins à moi:
Code :
- template <class TYPE>
- class Iterator
- {
- public:
- typedef TYPE POINTED;
- virtual ~Iterator<TYPE>() {}
- virtual const TYPE * operator *() = 0;
- virtual const Iterator<TYPE> & operator ++() = 0;
- };
- template <class TYPE> // TYPE should be an Iterator
- class IteratorWrapper
- {
- public:
- IteratorWrapper(TYPE * content) : target(content) { }
- ~IteratorWrapper() { delete target;}
- const typename TYPE::POINTED * operator *()
- {
- if (target)
- return target->operator *();
- else
- return NULL;
- }
- IteratorWrapper & operator ++() { target->operator ++(); return *this; }
- protected:
- TYPE * target;
- };
|
Ca permet à une classe de renvoyer un pointeur vers un itérateur (très pratique pour avoir des hiérarchies d'itérateurs). Et le client peut mettre ça dans un IteratorWrapper qui fonctionne tout comme un iterator mais qui gère automatiquement le déréférencement et le delete à la fin.
Message édité par Lam's le 26-01-2005 à 23:35:47