Определить, является ли тип указателем в функции шаблона
Если у меня есть функция шаблона, например:
template<typename T>
void func(const std::vector<T>& v)
Можно ли каким-либо образом определить внутри функции, является ли T указателем, или мне придется использовать для этого другую функцию шаблона, то есть:
template<typename T>
void func(const std::vector<T*>& v)
Спасибо
Ответы
Ответ 1
Действительно, шаблоны могут это сделать, с частичной специализацией шаблона:
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;
}
Если в функции, которую вы делаете, действительны только для указателей, вам лучше использовать метод отдельной функции, хотя, поскольку тип компилятора проверяет функцию в целом.
Однако вы должны использовать boost для этого, в том числе и это: http://www.boost.org/doc/libs/1_37_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html
Ответ 2
С++ 11 имеет небольшую небольшую проверку указателя, встроенную в
С
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';
}