stl中的variadic template可变参数模板使用

本文介绍了一个使用C++模板元编程实现的变长参数打印函数。通过递归模板特化,该函数可以接受任意数量和类型的参数,并将它们逐一打印出来。此示例展示了模板元编程的灵活性和强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include<iostream>
#include <algorithm>

/* 终止递归操作 */
void printv()
{
   std::cout << std::endl;
}

template<typename A, typename... B>
void printv(A a, B...b)
{
   std::cout <<  a << ",";
   printv(b...);
}
int main()
{
    printv(7.5, "hello world", 9, 'c', 7.2);
    return 0;
}

输出:

7.5,hello world,9,c,7.2,

4. 可变参数模板 4.1 基本语法及原理 • C++11⽀持可变参数模板,也就是说⽀持可变数量参数的函数模板和类模板,可变数⽬的参数被称 为参数包,存在两种参数包:模板参数包,表⽰零或多个模板参数;函数参数包:表⽰零或多个函 数参数。 • template <class ...Args> void Func(Args... args) {} • template <class ...Args> void Func(Args&... args) {} • template <class ...Args> void Func(Args&&... args) {} • 我们⽤省略号来指出⼀个模板参数或函数参数的表⽰⼀个包,在模板参数列表中,class...或 typename...指出接下来的参数表⽰零或多个类型列表;在函数参数列表中,类型名后⾯跟...指出 接下来表⽰零或多个形参对象列表;函数参数包可以⽤左值引⽤或右值引⽤表⽰,跟前⾯普通模板 ⼀样,每个参数实例化时遵循引⽤折叠规则。 • 可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。4.2 包扩展 比特就业课 • 对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个 包时,我们还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元 素应⽤模式,获得扩展后的列表。我们通过在模式的右边放⼀个省略号(...)来触发扩展操作。底层 的实现细节如图1所⽰。 • C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理。4.3 empalce系列接⼝ • template <class... Args> void emplace_back (Args&&... args); • template <class... Args> iterator emplace (const_iterator position, Args&&... args); • C++11以后STL容器新增了empalce系列的接⼝,empalce系列的接⼝均为模板可变参数,功能上 兼容push和insert系列,但是empalce还⽀持新玩法,假设容器为container<T>,empalce还⽀持 直接插⼊构造T对象的参数,这样有些场景会更⾼效⼀些,可以直接在容器空间上构造T对象。 • emplace_back总体⽽⾔是更⾼效,推荐以后使⽤emplace系列替代insert和push系列 • 第⼆个程序中我们模拟实现了list的emplace和emplace_back接⼝,这⾥把参数包不段往下传递, 最终在结点的构造中直接去匹配容器存储的数据类型T的构造,所以达到了前⾯说的empalce⽀持 直接插⼊构造T对象的参数,这样有些场景会更⾼效⼀些,可以直接在容器空间上构造T对象。 • 传递参数包过程中,如果是 Args&&... args 的参数包,要⽤完美转发参数包,⽅式如下 std::forward<Args>(args)... ,否则编译时包扩展后右值引⽤变量表达式就变成了左 值.想复习下可变参数模板
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值