traits(萃取)和 偏特化

来源:互联网 发布:图片加密软件 编辑:程序博客网 时间:2024/06/05 17:56

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> {};

  1. traits<My>:匹配 template<class T> traits {};
  2. traits<Other*>:匹配 template<class T> traits<T*> {};
  3. traits<My*>:匹配 template<> traits<My*> {};
  4. traits<const My*>:匹配 template<class T> traits<const T*> {};
  5. traits<My>:匹配 template<class T> traits {};
  6. traits<int>:匹配 template<> traits<int> {};
  7. traits<const int>:匹配 template<class T> traits {};