variadic Template(可变参数模板)
使用可变参数模板可以实现
- 递归调用
- 递归创建
- 递归继承
- 递归复合
variadic template
- template
- function template
- class tempalate
变化的区别
- 参数个数
- 利用参数个数逐一递减的特性,实现递归函数调用,使用function template 完成
- 参数类型
- 利用参数个数逐一递减,导致参数函数类型也逐一递减实现递归集成,或递归复合,以class template 完成
sample
code
例子1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15void printX(){
}
// 这个是特化版本,当前版本存在时,下面的函数不会呗调用 既 void printX(const Types& args) 不会被调用
template<typename T,typename... types>
void printX(constT& firstArg,const Types& args){
cout<<fistArg<<endl;
print(args...);
}
template<typename T,typename... types>
void printX(const Types& args){
cout<<fistArg<<endl;
print(args...);
}例子2 重写printf function
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21void printf(const char *s){
while(*s){
if(*s == '%'&&*(++s) !+'%'){
throw std::runtime_error("invalid format string:missing argument")
std::cout<<*s++;
}
}
}
template<typename T,typename... Args>
void printf(const char*s,T value,Args... args){
while(*s){
if(*s == '%' && *(++s) !='%'){
std::cout<<value;
printf(++s,args...);
return
}
std::cout<<*s++;
}
throw std::logic_error("extra argument provided to printf")
}例子3 max函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49//stl_algo.h
template<typename _ForwardIterator,typename _Compare>
_ForwardIterator
__max_element(_ForwardIterator __first,_ForwarIterator __last,_Compare __comp){
if(__first==__last) return __first;
_ForwardIterator __result=__first;
while(++__first!=__last)
if(__comp(result,__first))
__result =__first;
return __result;
}
template<typename _ForwardIterator>
inline _ForwardIterator
max_element(_ForwardIterator __first,_ForwarIterator __last){
return __max_element(__first,__last,__iter_less_iter());
}
//stl_algo.h
template<typename __Tp>
inline Tp
max(initializer_list<__Tp> __l){
return *max_element(_l.begin(),_l.end());
}
//predefined_oops.h
inline _Iter_less_iter
__iter_less_iter(){
return _Iter_less_iter();
}
//predefined_oops.h
struct _Iter_less_iter{
template<typename _Iterator1,
typename _Iterator2>
bool operator()(_Iterator1 __it1,_Iterator2 __it2)const{
return *__it1<*__it2;
}
}
cout<<max({1,2,3,4,5,6})<<endl;
//改进
cout<<max(1,2,3,4,5,6)<<endl;
template<typename... Args>
int maximum(int n,Args... args){
return std::max(n,max(...args));
}
例子4 类模板
用不同的方式处理first元素和last元素
1 | cout<< make_tuple(7.5,string("hello"),bitset<16>(377),42); |
例子5 用于递归继承
1 | template<typename...,Values> class tuple; |
例子6
用于递归复合
1 | template<typename... Values>class tup; |