zoukankan      html  css  js  c++  java
  • STL——萃取机制(Traits)

    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类型。

  • 相关阅读:
    Javascript中最常用的55个经典技巧(转)
    Yahoo!网站性能最佳体验的34条黄金守则(转载)
    你误解了Windows的文件后缀名吗?
    你不知道的Spring配置文件
    Thrift 个人实战--Thrift 的序列化机制
    Thrift 个人实战--Thrift 网络服务模型
    Thrift 个人实战--初次体验Thrift
    HBase 实战(2)--时间序列检索和面检索的应用场景实战
    Kafka实战系列--Kafka API使用体验
    Kafka实战系列--Kafka的安装/配置
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/12247007.html
Copyright © 2011-2022 走看看