2012-03-24 6 views
9

Gibt es eine Möglichkeit, dies mit einigen C++ 11 oder höchstens eine Boost-Bibliothek zu tun?standard C++ 11 Weg alle Zeiger eines Typs zu entfernen

#include <iostream> 
#include <typeinfo> 
using namespace std; 

template <typename T> class remove_all_pointers{ 
public: 
    typedef T type; 
}; 

template <typename T> class remove_all_pointers<T*>{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 

int main(){ 
    //correctly prints 'i' on gcc 
    cout<<typeid(remove_all_pointers<int****>::type).name()<<endl; 
} 
+0

Worauf möchten Sie diese Zeiger entfernen? – Gabe

+0

Klassen, grundlegende Typen, alles. –

+0

Wozu brauchst du das? –

Antwort

2

Weder Boost noch C++ 11 bietet eine solche Merkmalsvorlage. Aber dein Code sollte funktionieren.

5

Das funktioniert nicht für alle Zeigertypen. Sie müssen auch für verschiedene cv-Qualifier berücksichtigen:

template <typename T> class remove_all_pointers<T* const>{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 

template <typename T> class remove_all_pointers<T* volatile>{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 

template <typename T> class remove_all_pointers<T* const volatile >{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 
+0

Guter Punkt. Sie könnten std: remove_cv verwenden und an eine Routine senden, die das tut, was das Poster hat. – emsr

1

Mit 17 C++ eine lesbare, einfache und cv-Qualifier bewusst Meta-Funktion ist:

#include <type_traits> 

// unfortunately there's no std::identity anymore in C++17 
template <typename T> 
struct identity 
{ 
    using type = T; 
}; 

template<typename T> 
struct remove_all_pointers : std::conditional_t< 
    std::is_pointer_v<T>, 
    remove_all_pointers< 
     std::remove_pointer_t<T> 
    >, 
    identity<T> 
> 
{}; 

template<typename T> 
using remove_all_pointers_t = typename remove_all_pointers<T>::type; 

es dann wie verwenden:

int main() 
{ 
    remove_all_pointers_t<int* const* volatile* const volatile*> v = 42; 
    return 0; 
}