Шаблонная функция класса T: Как узнать, является ли T указателем? - PullRequest
6 голосов
/ 11 сентября 2009

В качестве продолжения этого вопроса : мне нужно определиться с функцией класса следующим образом:

template< typename T > bool Class::Fun <T*> ( T& variable ) {...}

указатель T или нет.

В приведенном выше вопросе ответ заключался в использовании частичной шаблонной специализации. Насколько я узнал, это невозможно для функций класса. Это правда? Если так, есть ли другой способ узнать, является ли T указателем?

Ответы [ 3 ]

22 голосов
/ 11 сентября 2009

Нет необходимости специализировать функцию-член. В этом ответе используется автономная структура. Вы все еще можете использовать его в функциях членов класса.

// stand-alone helper struct
template<typename T>
struct is_pointer { static const bool value = false; };    
template<typename T>
struct is_pointer<T*> { static const bool value = true; };

// your class
class Class{
public:
 template<typename T>
 void Fun(T& variable) {
     std::cout << "is it a pointer? " << is_pointer<T>::value << std::endl;
 }
};

С другой стороны, вы можете перегрузить функция:

class Class {
public:
 template<typename T>
 void Fun(T& variable) {
     std::cout << "is it not a pointer! " << std::endl;
 }
 template<typename T>
 void Fun(T*& variable) {
     std::cout << "is it a pointer! " << std::endl;
 }
};
8 голосов
/ 11 сентября 2009

Взгляните на boost :: is_pointer .

3 голосов
/ 11 сентября 2009

Посмотрите на Boost.TypeTraits вместе с Boost EnableIf .

...