STL笔记(6)——Traits编程技法
在C/C++中可以使用sizeof()来获取变量的大小,但是如果想获取变量的类型,却没有typeof()这样的函数,而Traits编程技法就是为了实现typeof()的功能,这种功能主要可以用于迭代器相应型别的设计上。
函数模板的参数推导机制
书中给出如下例子:
template <class I,class T>
void func_impl(I iter,T t)
{
}
template <class I>
void func(I iter)
{
func_imple(iter,*iter);
}
int main()
{
int i;
func(&i);
}
这里利用函数模板的参数推导机制通过 &i
推断出func的模板参数I
是一个int类型的指针,再通过I
类型变量iter
和其取内容*iter
获取到int*
和int
类型。
这种设计方式的缺陷就在于无法使用得到参数类型作为函数的返回值。
声明内嵌的函数模板
设计思路如下:
template<class T>
struct MyIter{
typedef T value_type;//内嵌型别声明
};
而作为函数返回值时的写法为:
template <class I>
typename I::value_type//函数返回类型
func(I ite)
{
}
//使用func
MyIter<int> ite(new int(8));
func(ite);
使用的时候,通过func模板函数的参数推断出 ite
的类型I
,接着使用之前定义的内嵌型别声明。这种方式的缺陷就是管不了原生指针,例如int*,它不存在内嵌类型。
偏特化
为模板的某个参数进行特化工作,也就是为泛化的设计提供特化的版本,这样我们就利用偏特化的特性为int 和const int 这种原生指针和const 指针设计特化版本:
template <typename T>
struct iterator_traits<T*>//为原生指针设计的特化版本
{
typedef T value_type;
};
template <typename T>
struct iterator_traits<const T*>//为const 指针设计的特化版本
{
typedef T value_type;
};