Ich verwende libgc, einen Garbage Collector für C und C++. Um STL-Container garbage collectible zu machen, muss man den gc_allocator verwenden.
Anstatt zu schreiben
std::vector<MyType>
muss man schreiben
std::vector<MyType,gc_allocator<MyType> >
Könnte es eine Möglichkeit geben, etwas zu definieren wie
template<class T> typedef std::vector<T,gc_allocator<T> > gc_vector<T>;
Ich habe mich vor einiger Zeit erkundigt und festgestellt, dass dies nicht möglich ist. Aber vielleicht habe ich mich geirrt oder es gibt eine andere Möglichkeit.
Die Definition von Karten auf diese Weise ist besonders unangenehm.
std::map<Key,Val>
wird
std::map<Key,Val, std::less<Key>, gc_allocator< std::pair<const Key, Val> > >
EDIT: Nachdem ich die Verwendung des Makros ausprobiert habe, habe ich herausgefunden, dass der folgende Code es kaputt macht:
#define gc_vector(T) std::vector<T, gc_allocator<T> >
typedef gc_vector( std::pair< int, float > ) MyVector;
Das Komma innerhalb der Definition des Schablonentyps wird als Makroargumenttrennzeichen interpretiert.
Es scheint also, dass die innere Klasse/das innere Konstrukt die beste Lösung ist.
Hier ein Beispiel dafür, wie es in C++0X gemacht wird
// 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;
0 Stimmen
Warum sagen Sie, dass die
TypeHelper
Lösung erfordert die Neudefinition von Konstruktoren? Es ist nichts weiter als eine Abkürzung auf einem typedef...0 Stimmen
Ups, Sie haben recht. Es ist gut, dass Sie dies in Ihrer Antwort klargestellt haben. Mir wurde gesagt, dass C++0X durch die Verwendung des Schlüsselworts "using" eine bessere Lösung bietet. Wissen Sie, wie das funktionieren würde?
1 Stimmen
C++0x wird Template-Aliase bereitstellen, mit denen man genau das tun kann, was man will. open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf
0 Stimmen
@WurmD welche aktualisierte Antwort ? Ich habe die akzeptierte Antwort in diejenige geändert, die die C++11-Methode bereitstellt. Ist es das, was Sie mich gefragt haben?