小工具知识网

当前位置: 首页 > 行业知识 > C++ 可变参数模板

行业知识

C++ 可变参数模板

2026-11-04 05:12:52 来源:互联网转载

可变参数列表

C语言中的可变参数列表

#include int main(){    printf("%d %d %d", 1, 2, 3);    return 0;}

​ ***可变参数列表:***接受任意个数的参数,如 printf 。

int printf(const char* format, ...);

​ 函数定义形参部分带 … 。在 C 语言中,三个点并非必要。

C++中的可变参数列表

形参包

void f(int ...num);

​ 形参包: … 与形参名结合便是形参包。形参包可接受任意多个参数。

​ ***范式:***上述的 num 便是范式。… 在形参名之前。

void f(int ...num) {    int arr[] = {num...};    //假设传了五个参数,则展开后为    //int arr[] = {num1, num2, num3, num4, num5};}

​ ***形参包展开:***参数列表中创建的形参包在后续index.php/tags-602.html" >使用必须展开。… 在范式后即为形参包展开。只展开 … 之前的语句,语句必须带范式形参。展开后的语句以逗号隔开。

可变参数模板

类型形参包

template

​ ***类型形参包:***与形参包类似,… 后带类型模板便是类型形参包。

templatestd::common_type_t Add(T ...num) {    /*...*/}/*std::common_type_t:自动适配尖括号中类型形参包的公共类型。假设调用为:Add(1.2,3,5.5f,'***总结:***三个点在变量名或模板类型名前是创建形参包,三个点在变量名或模板类型名后是展开形参包。',2ULL):std::common_type_t展开后为:std::common_type_tAdd(T ...num)展开后为:Add(double num1, int num2, float num3, char num4, unsign long long num5)*/

​ ***类型形参包展开:***与形参包展开类似,… 在类型名后便是类型形参包展开。

形参包后续类型形参

#include templateRT Add(const Args& ...nums) {RT temp[] = { nums... };return std::accumulate(std::begin(temp), std::end(temp), RT{ 0 });}//std::accumulate 通过迭代器求和//std::accumulate(起始迭代器, 终止迭代器, 求和结果变量)
无法手动指定

​ 后续类型形参

推导指引(C++17)

,只能通过缺省类型进行指定或推导。

templatestruct test {private:T a;public:test(T n) :a{ n } {}void type() {std::cout Ty arr[size];};//模板B,用于推导指引template array;//sizeof...(形参包):形参包参数个数

​ 推导指引只作用于类型模板。

array a{ 1,2,3,4,5 };array a{ 1,2,3,4,5 };//没有模板B则编译不通过,编译器无法自行推导

​ 如果没有模板B,多参数创建 array 必须指定模板类型。

上一篇:Nginx 的安装、启动和关闭

下一篇:VB验证码源码实现深度解析