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 typeIch 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 doubleOder ä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>::typeschreiben. 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
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 initializationSo 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...