Je suis en utilisant libgc, d'un ramasse-miettes pour le C et le C++. Pour faire des conteneurs STL ordures collectionner l'on doit utiliser la gc_allocator.
Au lieu d'écrire
std::vector<MyType>
on doit écrire
std::vector<MyType,gc_allocator<MyType> >
Pourrait-il y avoir un moyen de définir quelque chose comme
template<class T> typedef std::vector<T,gc_allocator<T> > gc_vector<T>;
J'ai vérifié il y a quelques temps et a découvert qu'il n'était pas possible. Mais j'ai peut-être été mal ou il y a peut-être une autre manière autour.
La définition des cartes de cette façon est particulièrement désagréable.
std::map<Key,Val>
devient
std::map<Key,Val, std::less<Key>, gc_allocator< std::pair<const Key, Val> > >
EDIT: Après essai de l'utilisation de la macro, j'ai trouvé le code suivant, il tombe:
#define gc_vector(T) std::vector<T, gc_allocator<T> >
typedef gc_vector( std::pair< int, float > ) MyVector;
La virgule à l'intérieur de l'basées sur des modèles de définition de type est interprété comme une macro argument séparateur.
Il semble donc que les inner class/struct est la meilleure solution.
Voici un exemple sur la façon dont il sera fait en C++0X
// standard vector using my allocator
template<class T>
using gc_vector = std::vector<T, gc_allocator<T> >;
// allocates elements using My_alloc
gc_vector <double> fib = { 1, 2, 3, 5, 8, 13 };
// verbose and fib are of the same type
vector<int, gc_vector <int>> verbose = fib;