std::remove_pointer::type

21/10/2014 - 08:53 von Helmut Zeisel | Report spam
Wieso ist std::remove_pointer<std::shared_ptr<A>>::type nicht A? Gibt es dafür einen technischen Grund oder wurde das einfach übersehen?

Beispiel:

struct A
{
typedef int some_type;
};
int main()
{

typedef std::remove_pointer<A*>::type::some_type type_from_ptr;

// VC 2013: error C2039: 'some_type' : is not a member of 'std::shared_ptr<A>'
// GCC 4.8.3: error: 'some_type' in
// 'std::__remove_pointer_helper<std::shared_ptr<A>, std::shared_ptr<A> >::type
// {aka class std::shared_ptr<A>}' does not name a type

typedef std::remove_pointer<std::shared_ptr<A>>::type::some_type
type_from_shared_ptr;

return 0;
}

Mit

namespace std
{
template < typename T > struct std::remove_pointer < std::shared_ptr<T> >
{
typedef typename T type;
};
};

klappt es wie gewünscht.

Darf ich den Namespace std auf diese Art öffnen?
Gibt es einen besseren Weg, an A::some_type heranzukommen, der sowohl für A* als auch für shared_ptr<A> klappt?

Danke,

Helmut
 

Lesen sie die antworten

#1 Helmut Zeisel
21/10/2014 - 10:20 | Warnen spam
Am Dienstag, 21. Oktober 2014 08:53:18 UTC+2 schrieb Helmut Zeisel:
Wieso ist std::remove_pointer<std::shared_ptr<A>>::type nicht A?



Ich habe jetzt noch folgendes gefunden:

http://stackoverflow.com/questions/...shared-ptr

"is_pointer detects "real" pointer types only, and not smart pointers. Users should not specialise is_pointer for smart pointer types, as doing so may cause Boost (and other third party) code to fail to function correctly."

Das gilt dann wohl analog fuer remove_pointer :-(

Was mir als Alternative eingefallen ist:

template < typename T > struct element_type
{
typedef typename T::element_type type;
};
template < typename T > struct element_type<T*>
{
typedef T type;
};

typedef element_type<std::shared_ptr<A>>::type::some_type
type_from_shared_ptr;
typedef element_type<A*>::type::some_type type_from_ptr;

Hat wer noch bessere Ideen?

Helmut

Ähnliche fragen