Typ von Elementen in boost::ptr_vector



  • Hallo zusammen,

    wie komme ich an den Typen dran, der in einem boost::ptr_vector ist?

    #include <memory>
    #include <boost/ptr_container/ptr_vector.hpp>
    
    struct Foo{
            typedef int type;
            type value;
    };
    
    struct Bar{
            typedef double type;
            type value;
    };
    
    template<typename T>
    void func(T& t){
            for(typename T::reference obj : t){
                    typename T::value_type::type v; 
                    v = obj.value;
            }
    }
    
    int main(){
            boost::ptr_vector<Foo> v1;
            boost::ptr_vector<Bar> v2;
            func(v1);
            func(v2);
    }
    

    Generell hätte ich vermutet, dass es der typedef value_type ist, aber das funktioniert leider nicht.

    test.cpp: In function 'void func(T&) [with T = boost::ptr_vector<Foo>]':
    test.cpp:25:9:   instantiated from here
    test.cpp:17:32: error: 'boost::ptr_sequence_adapter<Foo, std::vector<void*, std::allocator<void*> >, boost::heap_clone_allocator>::value_type' is not a class, struct, or union type
    test.cpp:17:32: error: 'boost::ptr_sequence_adapter<Foo, std::vector<void*, std::allocator<void*> >, boost::heap_clone_allocator>::value_type' is not a class, struct, or union type
    test.cpp: In function 'void func(T&) [with T = boost::ptr_vector<Bar>]':
    test.cpp:26:9:   instantiated from here
    test.cpp:17:32: error: 'boost::ptr_sequence_adapter<Bar, std::vector<void*, std::allocator<void*> >, boost::heap_clone_allocator>::value_type' is not a class, struct, or union type
    test.cpp:17:32: error: 'boost::ptr_sequence_adapter<Bar, std::vector<void*, std::allocator<void*> >, boost::heap_clone_allocator>::value_type' is not a class, struct, or union type
    

    Ich hab leider auch keinen passenden typedef beim Durchsuchen des Quelltexts gefunden.

    Steh ich gerade auf dem Schlauch? 🙄

    Wer kann mir den passenden typedef sagen oder wie man an den Typ dran kommt?

    Gruß,
    XSpille



  • Ich hab jetzt ne (dubiose) Lösung gefunden...

    typename boost::remove_reference<typename T::reference>::type::type v;
    

    Geht es nicht einfacher?



  • Wenn du ohnehin schon C++0x-Features benutzt, warum nicht gleich auto ?



  • Da es sich ja um den ptr_vector handelt, würde ich davon ausgehen, das value_type ein Pointertyp ist, als z.b. Foo*

    Kannst du ja leicht überprüfen mit folgender Krücke:

    ptr_vector<Foo>::value_type foo;
    double i = foo;
    

    Das sollte dann einen Kompilerfehler der folgender Art erzeugen:

    Couldn't convert Type ... to double
    

    Oder ähnlich.

    Und dort steht dann der Typ da 😉



  • bmario schrieb:

    Da es sich ja um den ptr_vector handelt, würde ich davon ausgehen, das value_type ein Pointertyp ist, als z.b. Foo*

    Genau. Um den Werttyp zu erhalten, könnte man remove_pointer<Container::value_type>::type schreiben. Oder direkt Typinferenz nutzen.



  • Nexus schrieb:

    Wenn du ohnehin schon C++0x-Features benutzt, warum nicht gleich auto ?

    Danke Nexus!
    Weil ich es bisher noch nicht kannte 🤡
    Aber stylistisch find ich es ehrlich gesagt auch nicht so schön 🙄

    @bmario

    test.cpp:27:13: error: cannot convert 'boost::ptr_sequence_adapter<Foo, std::vector<void*, std::allocator<void*> >, boost::heap_clone_allocator>::value_type' to 'double' in initialization
    

    So einleuchtend find ich die Fehlermeldung leider nicht 😞

    @Nexus:
    Ob remove_reference oder remove_pointer... So einen großen Unterschied sehe ich nicht in der Lesbarkeit 😉
    EDIT: Die Verwendung von value_type ist doch etwas schöner...


Anmelden zum Antworten