traits主要是用来萃取出某一个类中定义的value_type。
template<typename T>
struct A
{
typedef T value_type;
};
template<typename I>
struct traits
{
typedef typename I::value_type value_type; //此处的typename不可少
};
上例的 traits::value_type 的含义:类I中如果定义了value_type,那么就得到I::value_type。如果I是个原生类型(int, float, 或者 原生pointer),就要用到特化和偏特化
特化:
template<>
struct traits<int>
{
typedef int value_type;
};
对于 traits<int>::value_type 就是 int
偏特化:
template<typename I>
struct traits<I*> //
{
typedef I value_type;
};
对于 traits<int*>::value_type 就是 int。
template<typename I>
struct traits<const I*>
{
typedef I value_type;
};
对于 traits<const int*>::value_type 就是 int。如果没有上面这个偏特化,就会变成 const int。
所谓 特化 和 偏特化,就是 当遇到某个A<T>时,匹配哪个最合适的类模版定义。
template<class T> traits {};
template<class T> traits<T*> {};
template<class T> traits<const T*> {};
template<> traits<My*> {};
template<> traits<int> {};
- traits<My>:匹配 template<class T> traits {};
- traits<Other*>:匹配 template<class T> traits<T*> {};
- traits<My*>:匹配 template<> traits<My*> {};
- traits<const My*>:匹配 template<class T> traits<const T*> {};
- traits<My>:匹配 template<class T> traits {};
- traits<int>:匹配 template<> traits<int> {};
- traits<const int>:匹配 template<class T> traits {};
-