2012-03-24 6 views
9

¿Hay alguna manera de hacer esto con algunos C++ 11 o como máximo con una biblioteca de impulso?estándar C++ 11 forma de eliminar todos los apuntadores de un tipo

#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

¿De qué desea eliminar estos punteros? – Gabe

+0

clases, tipos fundamentales, todo. –

+0

¿Para qué necesitas esto? –

Respuesta

2

Ni Boost ni C++ 11 cuentan con una plantilla de rasgos. Pero tu código debería funcionar.

5

Eso no funciona para todos los tipos de puntero. Es necesario dar cuenta de diferentes cv-calificadores, así:

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

Buen punto. Puede usar std: remove_cv y enviar a una rutina que haga lo que tiene el póster. – emsr

1

con C++ 17 una función de meta legible, simple y CV-calificativo aware es:

#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; 

luego usarlo como:

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