C++日记——Day26:可变参模板

可变参函数模板

允许模板中含有0个,到 任意个 模板参数,在语法上也和传统模板不太一样。多了一个   ...

template<typename ... T>
void myfunc1(T... args)
{

}

func()
{
    myfunc1();
}

值得注意的:

1、我们一般把args成为一包,或者一堆参数,而且这些参数类型可以各不相同;我们理解T这种类型的时候不能把它理解成一个类型,应该理解成不同的类型,那自然对应的参数args也应该是多个不同的类型。

 2、这一包参数中可以容纳0 到 多个模板参数,而且这些模板参数可以为任意类型。

3、大家注意把名字理顺一下:

T后边带了... 所以,我们称呼T:可变参类型;这个东西看起来是一个类型名,实际上里面包含的是0到多个不同的类型。

args可变形参,既然T代表了一包类型,那显然args代表的就是是一包形参。

template <typename T, typename U>
void myfunc2(const T& firstarg, const U&... otherargs) // U&... 一包类型  
                                                       //otherargs 一包形参
{
    cout << sizeof...(otherargs) << endl; //sizeof...可变参数量
}

4、在具体函数形参中,&的位置,出现在了类型名的后边。

 

参数包的展开

一般都是用递归函数的方式来展开;

要求我们在代码编写中,有一个参数包展开函数,和一个同名递归终止函数,我么就是通过这两个函数把参数包展开的;

一个参数,一包参数这种可变参函数模板写法最适合参数包的展开

//递归终止函数,重载了myfunc3,在最后一步没有参数时执行
void myfunc3()
{
    cout << "参数包展开式执行了终止函数myfunc2()" << endl;
}


template<typename T, typename...U>
void myfunc3(const T& firstarg, const U&... otherargs)
{
    cout << firstarg << endl;
    myfunc3(otherargs...)
}


myfunc3(12, "abc", 33); //执行顺序
//myfunc3(12, "abc", 33);
    //myfunc3("abc", 33);
        //myfunc3(33);
            //myfunc3();

 

可变参类模板

允许模板定义中含有0到人一个模板参数

template<typename...Args> class myclass {}; //主模板

template <typename First, typename... Others>
class myclass<First, Others...> : private myclass<Others...> //偏特化
{
public:
    myclass():m_i(0){};
    First m_i;
}

int main(){
    myclass<int, float, double> myc;
}

 

typename<> class myclass<> //0个模板参数特化版本
{
public:
    myclass()
    {
        cout << "0个模板参数" << endl;
    }
    
}

 

 综合写法

class myclasst<First, Others...>:private myclasst<Others>
{
public:
    myclasst: m_i(0)
    {
        printf("myclasst::myclasst()执行了,this = %p", this);
    }

    myclasst(First partf, Others... parto) : m_i(partf), myclasst<Others...>(parto...)
    {
        cout << "-----------------------begin----------------------"<< endl;
        cout << "m_i = " << m_i << endl;
        cout << "-----------------------end------------------------"<< endl;
    }
    First m_i;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值