2008-11-19 8 views
28

Si tengo una función de plantilla, por ejemplo como este:Determinar si el tipo es un puntero en una función de plantilla

template<typename T> 
void func(const std::vector<T>& v) 

¿Hay alguna manera de poder determinar dentro de la función de si T es un puntero, o le tengo que utilizar otra función de plantilla para esto, es decir:

template<typename T> 
void func(const std::vector<T*>& v) 

Gracias

+0

Si, como Yo, si desea utilizar una función que puede ser diferente dependiendo de si 'T' es un puntero o no, puede encontrar esta respuesta muy útil: http://stackoverflow.com/questions/14466620/c-template-specialization- calling-methods-on-types-t hat-could-be-pointers-or/14466705 – davidhood2

Respuesta

77

de hecho, las plantillas pueden hacer que, con parcial de la plantilla especialización:

template<typename T> 
struct is_pointer { static const bool value = false; }; 

template<typename T> 
struct is_pointer<T*> { static const bool value = true; }; 

template<typename T> 
void func(const std::vector<T>& v) { 
    std::cout << "is it a pointer? " << is_pointer<T>::value << std::endl; 
} 

Si en la función usted hace cosas solo válidas para los punteros, es mejor usar el método de una función separada, ya que el compilador revisa la función como un todo.

Debería, sin embargo, utilizar impulso para esto, se incluye eso también: http://www.boost.org/doc/libs/1_37_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html

+0

+1 esta es la respuesta correcta de hecho :) –

+0

Buena respuesta gracias - Rob Stanley –

+0

Sí, buena respuesta, de hecho, solo puedo agregar 1. –

32

C++ 11 tiene un bonito cheque pequeño puntero construida en

De http://en.cppreference.com/w/cpp/types/is_pointer

#include <iostream> 
#include <type_traits> 

class A {}; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << std::is_pointer<A>::value << '\n'; 
    std::cout << std::is_pointer<A*>::value << '\n'; 
    std::cout << std::is_pointer<float>::value << '\n'; 
    std::cout << std::is_pointer<int>::value << '\n'; 
    std::cout << std::is_pointer<int*>::value << '\n'; 
    std::cout << std::is_pointer<int**>::value << '\n'; 
} 
Cuestiones relacionadas