2.10.1
实作出Pointer Traits
大部分type
traits的实作都依赖全特化或偏特化。下面代码用来判断型别T是否为指针:
1 template<typename T>
2 class TypeTraits
3 {
4 private:
5 template<class U> struct PointerTraits
6 {
7 enum { result = false };
8 typedef NullType PointeeType;
9 };
10 template<class U> struct PointerTraits<U*>
11 {
12 enum { result = true };
13 typedef U PointeeType;
14 };
15 public:
16 enum { isPointer = PointerTraits<T>::result };
17 typedef PointerTraits<T>::Pointeetype PointeeType;
18 };
对于一个指针型别,PointerTraits的偏特化版本更适合。所以对于一个非指针型别,result为false,所谓被指型别PointeeType不能拿来使用,只是一个不能被使用的占位型别(placeholder type)。
对于指向成员函数的指针,我们需要这样做:
1 template<typename T>
2 class TypeTraits
3 {
4 private:
5 template <class U> struct PToMTraits
6 {
7 enum{result = false};
8 };
9 template <class U, class V>
10 struct PToMTraits<U, V::*>
11 {
12 enum {reulst = true };
13 }
14 public:
15 enum { isMemberPointer = PToMTraits<T>::result};
16 };
17