首页 > 其他 > 详细

STL——萃取机制(Traits)

时间:2020-01-31 23:56:03      阅读:131      评论:0      收藏: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类型。

 

STL——萃取机制(Traits)

原文:https://www.cnblogs.com/wangshaowei/p/12247007.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!