traits(萃取)和 偏特化

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值