检测阵列类型不起作用

时间:2010-10-10 19:14:29

标签: c++ templates

template<typename T> 
class CompoundT {           // primary template 
  public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0, 
           IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; 
    typedef T BottomT; 
    typedef CompoundT<void> ClassT; 
};

template<typename T, size_t N> 
class CompoundT <T[N]> {    // partial specialization for arrays 
  public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 1, 
           IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; 
    typedef typename CompoundT<T>::BottomT BottomT; 
    typedef CompoundT<void> ClassT; 
}; 

并在主要:

template<class T>
bool isArray(T a)
{
    return CompoundT<T>::IsArrayT;
}

int _tmain(int argc, _TCHAR* argv[])
    {
        int a[10];
        cout << isArray(a);
        return 0;
}

为什么这不起作用?这个例子来自“模板完整指南”ch.19.2。

1 个答案:

答案 0 :(得分:5)

因为isArray必须引用,否则如果你按值获取数组,它就像你拿一个指针一样:)

template <class T>
bool isArray(const T& ) {...}

,因为

void f(int a[10]);

void f(int* a);

是等同的声明。