文章目录
前言
本篇文章笔者将会对C++11中又一重要问题进行探讨 — 可变参数模版 . 并且会对这部分常考的知识点进行深度讲解 .
一、什么是模版 ?
● 模版
笔者在之前文章介绍过 , 这里简单回顾一下 .
模板是C++⽀持参数化多态的工具 , 通过一种形式或形态能完成不同的内容/任务 .
在没有模版之前 , 我们想要写一个极其相似但又不同的函数 , 这时我们要写很多个去达到想要的效果 , 但是有了模版 , 就可以只写一个 " 工具 " , 这个工具能够帮我们生成对应的内容 .
以上简单的讲解了一下 , 具体可以看笔者之前详解 ~ .
二、可变参数模版
● 初见可变参数模版
- 介绍
1. 可变 , 就是参数类型可变的意思 , 不仅仅局限于参数类型必须相同 .
2. 还是一个模版
3. 分为模版参数包和函数参数包 , 即: 0 ~ n 个模版参数或 0 ~ n 个函数参数 .
- 本质
可变参数本质是模版的模版 . (下方有具体介绍 ~) .
- 写法
template <class ...Args> //可变类型
void f(Args ...args) // 可变参数
{
}
… 是必须有的 , 表示包 . 其中可以为 0 ~ n 个参数或类型
Args 为名字 , 可以任意起 .
● 深剖可变参数模版
这里必须知道一个前提 , 模版的推导都是编译器帮我们完成 , 不需要我们管理
并且推导是在编译时进行的 .
虽然 , 任务都交给了编译器去实现 , 那可变参数模版的原理是什么呢 ?
以下将探讨 .
给出以下代码 :
//万能引用 , 这里面会涉及引用折叠
template <class ...X> // 这里表示有很多个类型
void Print(X&&...args) // 这里表示有很多个参数
{
}
int main()
{
string st;
//函数模版不用显示实例化 , 编译器会自动推导 , 编译器会自动生成相应的函数
Print(); // 0 个参数
Print