zoukankan      html  css  js  c++  java
  • 模板学习系列(一)tuple

     虽然我对boost,模板,乃至c++都很不爽,但是最近在看一套代码,里面的基本架构全是模板,无奈只好补补功课,认真学一下模板

    首先从tuple开始

    tuple,pair升级版,能容纳多个元素

    用处:使用它可以很方便的返回多个值(有什么其它的用处没?)

    下面是一个简单的实现

    struct null_type//建一个默认符号
    {
    
    };
    //注意模板的默认值
    template<typename T0=null_type,typename T1=null_type,typename T2=null_type>
    struct uttuple
    {
        T0 value0;
        T1 value1;
        T2 value2;
        uttuple()
        {
            
        }
        uttuple(const T0& t0,const T1& t1,const T2& t2):
        value0(t0),value1(t1),value2(t2)
        {
    
        }
        
    };
    //偏特化
    template<typename T0,typename T1>
    struct uttuple<T0,T1,null_type>
    {
        T0 value0;
        T1 value1;
        uttuple()
        {
            
        }
        uttuple(const T0& t0,const T1& t1):
        value0(t0),value1(t1)
        {
            
        }
    };
    //偏特化
    template<typename T0>
    struct uttuple<T0,null_type,null_type>
    {
        T0 value0;
        uttuple()
        {
            
        }
        uttuple(const T0& t0):
        value0(t0)
        {
        }
    };
    //make_tuple
    //由于并不能用直接使用uttuple tu(1,2),必须使用uttuple<int,int> tu(1,2)
    //这是由于不能进行这样的类型推断,似乎是因为这是两个过程:首先确定特化类,然后特化构造函数,没法跳过第一个步骤?
    //但是可以直接使用make_tuple(1,2)
    template<typename T0,typename T1,typename T2>
    uttuple<T0,T1,T2> utmake_tuple(T0 t0,T1 t1,T2 t2)
    {
        return uttuple<T0,T1,T2>(t0,t1,t2);
    }
    template<typename T0,typename T1>
    uttuple<T0,T1> utmake_tuple(T0 t0,T1 t1)
    {
        return uttuple<T0,T1>(t0,t1);
    }
    template<typename T0>
    uttuple<T0> utmake_tuple(T0 t0)
    {
        return uttuple<T0>(t0);
    }

    可以轻易的拓展到9个参数

    boost里面的tuple实现的非常精巧,用到了模板元编程,使用递归来生成最后的tuple的结构(不像这里使用偏特化来处理),代码相当复杂,而且取元素的时候需要必须get<n>(),反人类

    这里只需要tuple.value0就好了

      

  • 相关阅读:
    Unity5和WebGL移植指南的一些总结
    Unite洛杉矶峰会精彩回顾:从图形、平台再到VR
    比代码更重要的是团队管理
    初期游戏编程的9大法则
    关于Unity3D手机网游开发一些小看法
    守住真我
    学习要讲方法
    学习笔记|编程风格
    随便记
    微信方法
  • 原文地址:https://www.cnblogs.com/mightofcode/p/2803773.html
Copyright © 2011-2022 走看看