2009-09-11 4 views
6

В качестве последующих мер по this question: Мне нужно решить, в функции класса, как это:Templated class function T: Как узнать, является ли T указателем?

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

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

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

+1

@iammilind: Вы заметите, что этот вопрос уже связан с вопросом вы пометили его дубликат и это также было сказано там, в каком отношении оно отличается. Удалите «отмечен как дубликат». – fuenfundachtzig

ответ

22

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

// 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; 
} 
}; 
+2

Вы показали два очень хороших способа достижения этого. К сожалению, у меня есть только один голос, чтобы дать вам. ':)' – sbi

+0

Спасибо за похвалу, но я бы сказал, что я показал обычные/стандартные способы достижения этого. –

+2

Это не значит, что они не могут быть очень хорошими. ':)' – sbi

Смежные вопросы