template的应用
函数模板
类模板
模板的参数是变量
参数的个数可以变化
参数的类型可以不同
C++11模板有接受变化数量模板参数的能力,通过7个例子介绍这种能力的使用。
Example 1:
void printX() {}
template<T, typename... types>
void printX(const T& firstArg, const types&... args) {
std::cout << firstArg;
printX(args...);
}
另外上面的printX可以写成下面的格式,下面这种格式为泛化格式版本
template<typename... types>
void printX(const types&... args) {
//statement
}
Example2
printf("%s, %d, %c\n", "haiyang", 15, 'c');
void printf(const char *s) {
whild(*s) {
if ((*s == "%") && (*(++s) != "%")) {
printf("invalid format stting:missing arguments");
}
std::cout << *s++;
}
return;
}
template<T, typename... types>
void printf(const char* s, T value, const types&... args) {
while(*s) {
if ((*s == "%") && (*(++s) != "%")) {
std::cout << value;
print(s, args...);
return;
}
std::cout << *s++;
}
return;
}
参数的types相同,采用initializer_list, 不需要variadic templates
Example 3
struct maxCmp {
template<typename Iterator>
bool operator ()(const Iterator iter1, const Iterator iter2){
return *iter1 < *iter2;
}
}
maxCmp getMaxCmpObj() {
return maxCmp();
}
template<typename Iterator, typename Cmp>
Iterator _getMaxData(Iterator begin, Iterator end, Cmp cmp) {
Iterator maxValue = begin;
while(begin != end) {
if (cmp(maxValue , begin))
maxValue = begin;
}
begin++;
}
return maxValue ;
}
template<typename Iterator>
Iterator getMaxData(Iterator begin, Iterator end) {
return _getMaxData(begin, end, getMaxCmpObj());
}
template<typename _TP>
inline _TP Max(initializer_list<_TP> _l) {
return *getMaxData(_l.begin(), _l.end());
}
Example 4 Max函数也可以采用variadic templates
int maximum(int n) {
return n;
}
template<typename... types>
int maximum(int n, types... arg) {
return std::max(n, maximum(arg...));
}
variadic template 5: variadic template + tuple + print
template<typename... args>
ostream& << (ostream os, const tuple<Args...>& t) {
os << "[";
PrintTuple<0, sizeof(Args...), Args...>::print();
os << "]"
}
template<int IDX, int MAX, typename... Args>
struct PrintTuple {
static void print(ostream os, const tuple<Args...>& t) {
os << get<IDX>(t) << (IDX + 1 == MAX?"":",");
PrintTuple<IDX+1, MAX, Args>::print();
}
}
//特化类PrintTuple用于结束循环
template<int MAX, typename... Args>
struct PrintTuple<MAX, MAX, Args...>
static void print(ostream os, const tuple<Args...>& t) {
}
}