[c++] 可变参数模版

前言

可变参数模板是C++11及之后才开始使用,学校的老古董编译器不一定能用

相信大家在刚入门c/c++时都接触过printf函数

复制代码
int printf ( const char * format, ... );

printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类似这种的传参,在C里似乎并不支持

c++11提出了可变模板参数来解决这一问题

语法

template<class ...Argc> // 模板处, 在模板名前加三个点

void test_arcg(Argc... argc) {} // 传参处,在模板名后面加三个点

// 模板这块点的位置非常非常怪,很容易记混,如果忘了就换个位置多敲两次


匹配优先级

在模板部分我们了解过,对于一个函数调用来说,如果有非模板的优先匹配非模板的,在匹配模板的,而可变参数的匹配优先级在模板之下,

如果有已经实例化的,优先匹配实例化的,如果有模板的再去匹配模板的,如果实例化和模板的都不匹配,那就匹配可变参数模板


sizeof操作符

sizeof是c/c++内置的一个操作符,在没学可变模板参数之前用来计算一个数据对象所占内存大小,在可变模板参数这里被特化为求可变模板的数据

语法为 sizeof...(args) ,很怪很怪


访问可变模板参数数据

1.递归式展开

思路:在可变模板参数前加上一个模板,这样的话第一个参数优先匹配模板,在函数体内在递归调用该函数,写一种无参的函数,最后无参数时调用无参的直接跳处函数

cpp 复制代码
void _fun() {
    return;
}
template<class T, class ...Args >
void _fun(T t, Args ... args) {
    cout << t << endl;
    _fun(args...);
}
template<class ...Args>
void fun(Args... args) {
    _fun(args...);
}

int main() {
    fun(1,"123456",5.5);
    system("pause");
}

2.逗号表达式型

cpp 复制代码
template <class T>
void PrintArg(T t) {
 cout << t << " "; }
//展开函数
template <class ...Args>
void ShowList(Args... args) {
 int arr[] = { (PrintArg(args), 0)... };
 cout << endl; }
int main()
{
 ShowList(1);
 ShowList(1, 'A');
 ShowList(1, 'A', std::string("sort"));
 return 0; }

感谢观看

相关推荐
北冥you鱼4 分钟前
Go-Ethereum (Geth) 最佳实践:从部署到生产环境优化
开发语言·后端·golang
这不小天嘛7 小时前
JAVA八股——J集合篇
java·开发语言
AOwhisky7 小时前
Python 学习笔记(第一期与第二期)——基础语法——核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发
喜欢的名字被抢了10 小时前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
从零开始的代码生活_12 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
wabs66612 小时前
关于单调栈【力扣739.每日温度的思考】
java·开发语言
AOwhisky12 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
aaPIXa62213 小时前
C++ 用 13 条规则让模型写出安全现代 C++
java·c++·安全
逆向编程13 小时前
Socket异常连接自动清理方案
开发语言
枕星而眠14 小时前
【数据结构】红黑树入门指南
运维·数据结构·c++·后端