深圳市住房和建设局网站和市住宅租赁管理服务中心,外贸网站布局,广州天河网站制作,中国的网站域名是什么意思前言
可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用
相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…前言
可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用
相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类似这种的传参,在C里似乎并不支持
c11提出了可变模板参数来解决这一问题
语法 templateclass ...Argc // 模板处, 在模板名前加三个点 void test_arcg(Argc... argc) {} // 传参处,在模板名后面加三个点 // 模板这块点的位置非常非常怪,很容易记混,如果忘了就换个位置多敲两次 匹配优先级 在模板部分我们了解过,对于一个函数调用来说,如果有非模板的优先匹配非模板的,在匹配模板的,而可变参数的匹配优先级在模板之下, 如果有已经实例化的,优先匹配实例化的,如果有模板的再去匹配模板的,如果实例化和模板的都不匹配,那就匹配可变参数模板 sizeof操作符 sizeof是c/c内置的一个操作符,在没学可变模板参数之前用来计算一个数据对象所占内存大小,在可变模板参数这里被特化为求可变模板的数据 语法为 sizeof...(args) ,很怪很怪 访问可变模板参数数据
1.递归式展开 思路:在可变模板参数前加上一个模板,这样的话第一个参数优先匹配模板,在函数体内在递归调用该函数,写一种无参的函数,最后无参数时调用无参的直接跳处函数 void _fun() {return;
}
templateclass T, class ...Args
void _fun(T t, Args ... args) {cout t endl;_fun(args...);
}
templateclass ...Args
void fun(Args... args) {_fun(args...);
}int main() {fun(1,123456,5.5);system(pause);
}
2.逗号表达式型
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; } 感谢观看