variadic templates

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) {
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值