C++可变参数模板

二、可变参数模板

一个可变参数模板(variadic template)就是一个接受可变数目参数的模板函数或模板类。可变数目的参数被称为参数包(parameter packet)。存在两种参数包:模板参数包(表示零个或多个模板参数)和函数参数包(表示零个或多个函数参数)。

上述说到我们可以使用一个initializer_list来定义一个可接受可变数目实参的函数,但是所有实参必须具有相同的类型。当我们既不知道要处理的实参数目也不知道它们的类型时,我们就需要使用可变参数的函数模板了。我们用一个省略号来指出一个模板参数或函数参数表示一个包:在一个模板参数列表中,class...或typename...指出接下来的参数表示零个或多个类型的列表;一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数的列表。在函数参数列表中,如果一个参数的类型是一个模板参数包,则此参数也是一个函数参数包。

?
1
2
3
// Args是一个模板参数包;rest是一个函数参数包
template < typename T, typename ...Args>
void foo( const T &t, const Args&...rest);

可变参数函数模板通常是递归的。第一步调用处理包中的第一个实参,然后用剩余的实参调用自身。为了终止递归,我们还需要定义一个非可变参数的函数模板:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 用来终止递归并处理包中最后一个元素
template < typename T>
void print( const T &t)
{
   cout << t;
}
  
// 包中除了最后一个元素之外的其他元素都会调用这个版本的print
template < typename T, typename ...Args>
void print( const T &t, const Args&...rest)
{
   cout << t << " " ;   // 打印第一个实参
   print(rest...);    // 递归调用,打印其他实参
}
  
// 测试
int main()
{
   print( "string1" , 2, 3.14f, "string2" , 42);
   cout << endl;
   return 0;
}

非可变参数版本的print负责终止递归并打印初始调用中的最后一个实参。对于最后一次递归调用print(42),两个print版本都是可行的。但是,非可变参数模板比可变参数模板更特例化,因此编译器选择非可变参数版本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值