2011-06-02 21 views
7

Sé cómo escribir algo, pero estoy seguro de que hay una forma estándar de pasar algo como func<TheType*>() y usar magia de plantilla para extraer TheType para usar en tu código (tal vez TheType :: SomeStaticCall).¿Cómo obtengo el tipo de puntero en una plantilla?

¿Cuál es la forma/función estándar para obtener ese tipo cuando se pasa un ptr?

+5

Debe agregar un código para aclarar la pregunta. ¿Qué es lo que quieres hacer, cuáles son las entradas? –

+0

@David: tuve algo pero tuve la omisión de no darme cuenta de que debía filtrarse como una etiqueta (y no aparecer). ¿Lo hace desde ATM? –

Respuesta

16

Creo que desea eliminar el puntero del argumento de tipo a la función. Si es así, entonces aquí es cómo se puede hacer esto,

template<typename T> 
void func() 
{ 
    typename remove_pointer<T>::type type; 
    //you can use `type` which is free from pointer-ness 

    //if T = int*, then type = int 
    //if T = int****, then type = int 
    //if T = vector<int>, then type = vector<int> 
    //if T = vector<int>*, then type = vector<int> 
    //if T = vector<int>**, then type = vector<int> 
    //that is, type is always free from pointer-ness 
} 

donde remove_pointer se define como:

template<typename T> 
struct remove_pointer 
{ 
    typedef T type; 
}; 

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

En C++ 0x, remove_pointer se define en el archivo de cabecera <type_traits>. Pero en C++ 03, debes definirlo tú mismo.

+0

así que remove_pointer no está en la std? Esto es exactamente lo que quería pero mi instinto dice que hay algo en stl que puedo usar (¿pero quizás no?) –

+0

@ acidzombie24: En C++ 0x, sí. En C++ 03, No. – Nawaz

+0

maldición, ¿qué hay en C++ 0x? (Encabezado y supongo que el nombre de la estructura si no es el mismo) Supongo que estaba medio en lo cierto? –

Cuestiones relacionadas