zoukankan      html  css  js  c++  java
  • c/c++ 模板与STL小例子系列<三> traits

    c/c++ 模板与STL小例子系列<三> traits

    对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题。

    从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介。traits好像可以解决这种问题。

    通过traits技术,可以达到扔进去什么类型,给我吐出什么类型

    扔进去的是int出来的t1也是int类型

    Iterator_1<int>::value_type t1 = 100;
    

    下面弄了3个小例子,可以初步感受一下。

    例子1:

    #include <iostream>
    using namespace std;
    
    template<typename T, typename U>
    class traits{
    public:
      typedef T value_type1;
      typedef T& ref1;
      typedef U value_type2;
      typedef U& ref2;
    };
    
    template<typename TA, typename UA>
    class A : public traits<TA, UA>
    {
    
    };
    
    int main(){
      A<int, double>::value_type1 a = 10;
      A<int, double>::ref1 b = a;
      cout << a << endl;
      cout << b << endl;
      A<int, double>::value_type2 a1 = 10.2;
      A<int, double>::ref2 b1 = a1;
      cout << a1 << endl;
      cout << b1 << endl;
    }
    

    例子2:

    #include <iostream>
    using namespace std;
    class Test1;
    class Test2;
    
    template<typename T>
    class TypeTb1{};
    
    template<>
    class TypeTb1<Test1>{
    public:
      typedef char ret_type;
      typedef int p1_type;
      typedef double p2_type;
    };
    template<>
    class TypeTb1<Test2>{
    public:
      typedef double ret_type;
      typedef double p1_type;
      typedef int p2_type;
    };
    template<typename T>
    class Test{
    public:
      typename TypeTb1<T>::ret_type func(typename TypeTb1<T>::p1_t
    ype x,
                                  typename TypeTb1<T>::p2_type y){
        return x;
      }
    };
    int main(){
      Test<Test1> t;
      cout << t.func(65, 6.18) << endl;
      Test<Test2> t2;
      cout << t2.func(6.18, 65) << endl;
    }
    

    例子3:

    #include <iostream>
    using namespace std;
    
    class A{
    public:
      void show(){cout << "A show" << endl;}
    };
    template<typename T>
    class Iterator_1{
    public:
      typedef T value_type;
      typedef value_type* ptn;
      typedef value_type& ref;
    };
    template<typename T>
    class Iterator_2{
    public:
      typedef T value_type;
      typedef value_type* ptn;
      typedef value_type& ref;
    };
    
    template<typename T>
    struct Traits{};
    
    template<typename T>
    struct Traits<T *>{
      typedef T value_type;
      typedef value_type* ptn;
      typedef value_type& ref;
    };
    
    int main(){
      Iterator_1<int>::value_type t1 = 100;
      cout << t1 << endl;
      Iterator_2<double>::value_type t2 = 1.23;
      cout << t2 << endl;
      Traits<double*>::value_type t3 = 4.45;
      cout << t3 << endl;
    
      Iterator_1<A>::ptn p;
      p->show();
    }
    
  • 相关阅读:
    省市县区镇街道可查询地址
    用代码实现表情包
    如何让input number类型的标签不产生上下加减的按钮
    float类型如何转换为string类型
    php 如何得到不含前导0的时分秒
    项目引入非配置的文件,打成war包后测试报错的可能原因
    Spring Cloud(十四)Config 配置中心与客户端的使用与详细
    Spring Cloud (十三) Zuul:静态路由、静态过滤器与动态路由的实现
    Spring Cloud(十二)声名式服务调用:Feign 的使用(下)
    Spring Cloud(十一)声名式服务调用:Feign的使用 (上)
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9590029.html
Copyright © 2011-2022 走看看