模æ¿åŒ–类函数T:如何判断T是å¦ä¸ºæŒ‡é’ˆï¼Ÿ

时间:2009-09-11 19:04:58

标签: c++ templates typetraits

作为this questionçš„åŽç»­è¡ŒåŠ¨ï¼šæˆ‘需è¦åœ¨è¿™æ ·çš„类函数中åšå‡ºå†³å®šï¼š

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

T是å¦æ˜¯æŒ‡é’ˆã€‚

在上é¢å¼•ç”¨çš„问题中,答案是使用部分模æ¿ä¸“业化。æ®æˆ‘所知,这对于类功能是ä¸å¯èƒ½çš„。这是真的?如果是这样,是å¦æœ‰å¦ä¸€ç§æ–¹æ³•å¯ä»¥æ‰¾å‡ºT是å¦ä¸ºæŒ‡é’ˆï¼Ÿ

3 个答案:

答案 0 :(得分: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;
 }
};

答案 1 :(得分:8)

看看boost::is_pointer。

答案 2 :(得分:3)

与Boost.TypeTraits一起查看Boost EnableIf。