Подтвердить что ты не робот

Определить, является ли тип указателем в функции шаблона

Если у меня есть функция шаблона, например:

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

Можно ли каким-либо образом определить внутри функции, является ли T указателем, или мне придется использовать для этого другую функцию шаблона, то есть:

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

Спасибо

4b9b3361

Ответ 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';
}