可变参模板

本文介绍了C++11中引入的可变参模板,包括可变参数包的类型和非类型版本,以及如何在函数和类中使用它们进行元组操作、递归和组合关系的实现。展示了可变参函数模板的定义、调用及递归应用,以及可变参类模板的使用和展开方式。
摘要由CSDN通过智能技术生成

目录

概述

可变参函数模板

可变参类模板


概述

可变参模板是C++11引入的一个功能强大的特性。英文名是Variadic Templates。其允许我们定义参数数量可变的模板函数和模板类,更加的提高了编写的灵活性和通用性。在可变参数模板中,参数的数量在编译时才会确定。这种机制多用于元组操作、函数封装、递归模板等需要处理不确定参数数量的场景。

可变参函数模板

定义可变参数模板使用参数包: ...  ,表示接受可变数量的参数,参数包可以分为类型参数包和非类型参数包两种。通常将此方法定义的参数叫做一包参数,代表零个到多个参数。 

template<class... T>//类型模板参数,T叫做可变参类型
void Func(T... args)
{
    cout<<sizeof...(args)<<endl;//输出可变参数目
}

Func(10,5,7,"abc");//可变参函数模板的调用

template<int... a>//非类型模板参数
void Func2(a)
{
    int total=(...+a);//使用折叠表达式计算参数包中所有值的和
    cout<<"Sum="<<total<<endl;
}

Func2(1,2,3,4,5,6,7,8,10);//可变参函数模板的调用

我们可以通过递归的方法展开参数包,将参数包中的参数一一分开。方便起见,我们定义可变参函数模板一般将模板参数设为一个参数和一个参数包,这样展开较为便捷。

template<class... T,class R>
void Func(R& a,const T&... b)
{
    cout<<a<<endl;
    Func(b...);
}

void Func()//终止函数
{
    cout<<"递归终止函数"<<endl;
}

可变参类模板

和可变参函数模板一样,可变参类模板同样支持将一包参数作为模板参数。一包参数的参数个数范围亦为零个到多个。但展开方式与可变参函数模板不尽相同,相比之下较为复杂。

template<class... T> class A{};//递归继承方式参开参数包
template<class Firstone,class... Others>
class A<Firstone,Others...> : private A<Others...>
{
public:
    A() :a(0)
    {
        cout<<a<<endl;
    }
     A(Firstone m,Others n) :a(m),A(n...)
    {
        cout<<a<<endl;
    }
    Firstone a;
};

 组合关系和继承关系都是面向对象编程的重要概念。组合关系即一个类包含另一个类对象。

//递归组合方式展开参数包
template<class Firstone,class... Others>
class A
{
public:
    A :a(0)
    {
        cout<<a<<endl;
    }
     A(Firstone m,Others n) :a(m),ab(n...)
    {
        cout<<a<<endl;
    }
public:
Firstone a;
A<Others...> ab;
};

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼多不菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值