STL——萃取机制(Traits)

熊孩纸 阅读:907 2020-11-25 17:30:51 评论:0

1.定义:traits中文意思是特性,它通过提取不同类的共性,使得可以统一处理。

2.技术实现:traits运用显式模板特殊化(模板偏特化,全特化)将代码中因为类型不同而发生变化的片段提取出来,用统一的接口来包装,并通过traits模板类公开的接口间接访问相应的类。

下面是STL萃取的片段代码

 

 

 

 

 可能看的一头雾水,下面自己模拟实现一个就明白了

#include <iostream> 
using namespace std; 
  
//类似迭代器模板类 
template<class T> 
struct MyIter { 
    typedef T value_type; 
    T* ptr; 
    MyIter(T* p = 0) : ptr(p) {    } 
    T& operator*() const { return *ptr; } 
}; 
 
//萃取用的结构体iter_traits 
template<class I> 
struct iter_traits { 
    typedef typename I::value_type value_type; 
}; 
//对于指针的范围偏特化 
template<class I> 
struct iter_traits<I*> { 
    typedef I value_type; 
}; 
 
//利用偏特化的萃取, MyType 萃取出了int 
template<class O> 
void func_trait(O ite) 
{ 
    typedef iter_traits<O::value_type>::value_type MyType; 
    MyType a = **ite; 
    cout << a; 
} 
 
//普通版本的萃取,MyType萃取出了int* 
template<class O> 
void func(O ite) 
{ 
    typedef iter_traits<O>::value_type MyType; 
    MyType a = reinterpret_cast<MyType>(**ite); 
    cout << *ite << endl; 
    cout << **ite << endl; 
} 
 
int main() 
{ 
    int *a = new int(2); 
    MyIter<int*> ite(&a); 
    func(ite); 
 
        func_trait(ite); 
    return 0; 
}

这里MyIter是个迭代器类模板,模板参数类型为T,main函数中这个T为int*, 那我们定义一个参数为int*的迭代器对象,对这个迭代器取内容就应该是int*,实际上是个指针, 这里定义了一个萃取用的结构体iter_traits,普通版的是做为萃取出int*这个类型,便于作为函数返回值或者是定义变量,偏特化版的用做萃取出int类型。

 

标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号