偏特化
提供另一份template定义式,其本身仍为templatized
针对任何template参数更进一步限制所设计出来的特化版本
template<typename U, typename V>
class C
{}
//偏特化可以是:
template<typename U, typename V>
class C<U*, V*>
{
}
特化
template<>
class C<int, long>
{}
有了这项利器,我们可以解决很多原生指针的问题
traits 特性萃取
模板函数的参数可以推导,但是函数的返回值无法推导
内置类型可以定义一个内嵌声明可以解决函数返回值的问题,但原生指针无法定义内嵌声明,如下是内嵌声明
template <class T>
struct MyIter
{
typedef T value_type; //内嵌声明
}
我们可定义一个萃取器解决该问题
template <class I>
struct Iterator_traits
{
typedef typename I::value_type;
}
好处呢?
traits可以有特化版本,解决上面原生指针的问题
template <class I>
struct Iterator_traits<I*>
{
typedef typename I value_type;
}
一个完整的例子:
实现迭代器内元素相加的功能,注意元素相加后可能超出元素范围,本例子简单提升类型解决该问题。
//traits特性
template<typename >
class add_traits
{
typedef typename::T return_type;
};
//以int类型为例,特化
template<>
class add_traits<int>
{
typedef long return_type;
};
template<typename T>
typename add_traits<T>::return_type add(const T * const start, const T * const end)
{
}
此处如果不使用traits,将定义多个函数