Container::allocator_type verwenden



  • Ich schreibe eine Funktion die STL-Container verarbeitet, die Pointer-Typen enthalten können. Die Funktion kann die Objekte von dem Typ erzeugen. Wie kann ich dazu den Allocator des Containers verwenden?



  • Wenn ich das richtig sehe, garnicht. Der Allokator ist für T*'s, nicht für T's.

    Außerdem ist der Container::value_type eh immer nur T. Du kannst zwar über Template-Spezialisierungen herausfinden, ob T ein Zeiger auf einen Typ U ist oder nicht, aber so richtig hilft das noch nicht, denn du hast keinen "passenden" Allokator für Typ U.

    Gebe allerdings keine 100%ige Garantie auf Richtigkeit, da ich noch nicht sehr viel mit den STL-Allokatoren gearbeitet habe.


  • Mod

    allocatoren besitzen für diesen zweck ein eingebettes klassentemplate rebind, das es ermöglicht, ausgehend von einem allocator A<T> zum allocator A<U> zu gellangen (also eine metafunktion, wenn auch nicht mpl-kompatibel). z.b.

    template<typename T, typename A> void foo(std::vector< T*, A > v)
    {
        typedef typename A::template rebind<T>::other T_allocator;
       //usw
    }
    

    eine solche einrichtung ist auch zwingend notwendig, wenn wir bedenken, dass node-basierte container (list,set,map etc.) gar keine Ts allokieren.


Anmelden zum Antworten