模板学习系列(一)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就好了

  

原文地址:https://www.cnblogs.com/mightofcode/p/2803773.html