C++11中可变参数个数的模板(variadic template)

C++11正式标准是2011年就出来了,前一段时间就听说它增加了不少功能,但一直没用到它。直到最近需要用到可变参数个数的模板,用之前的语法很累赘也存在缺陷,这时查看C++11发现有我需要的类似功能。下面是我做的一点尝试。

 

VS2012支持C++11中的部分标准,其中包括可变参数个数的模板(variadic template),但必须安装微软在2012年11月出版的vc_compilerCTPNov2012.exe编译器(这个可以在微软官网下载http://www.microsoft.com/en-sg/download/details.aspx?id=35515)。

 

首先,我用的安装包是VS2012_ULT_chs.iso,解压之后直接点击安装程序进行安装,全部默认配置,花费6G多的空间,顺利安装成功。然后,用新建个“控制台工程”,里边“cout<<"xxx"<<endl”,发现编译不通过,有错误:“Cannot open include file: 'SDKDDKVer.h' ”。(这个我不知道是什么原因,可能与我之前安装的VS2010有关,或者VS2012需要Win8的库支持)

 

网上找到解决办法,需要安装Windows Driver Kit (WDK) 8 Consumer Preview:http://msdn.microsoft.com/en-us/windows/hardware/hh852362 。默认路径安装后,在项目配置中包含WDK的头文件目录和库目录,我的机器是win7旗舰版32位的,分别路径为C:\Program Files\Windows Kits\8.0\Include\shared;C:\Program Files\Windows Kits\8.0\Include\um和C:\Program Files\Windows Kits\8.0\Lib\win8\um\x86;,然后重新编译成功。

 

当用template<typename... Elements> class tuple;测试时,报错“ error C2143: 语法错误 : 缺少“,”(在“...”的前面) ”,是的,下载安装vc_compilerCTPNov2012.exe后还需要在VS2012中配置它。打开项目属性->配置属性->常规里边的“平台工具集”,选择“vc_compilerCTPNov2012”,再重新生成解决方案,成功通过。

 

好吧,现在才开始正式测试。

参考C++11标准中文版文档(http://download.csdn.net/detail/herojia_1/6013155)和英文版文档(http://download.csdn.net/detail/herojia_1/6013191),其中说明部分:“没有一个简洁的机制对变长参数模板中的值进行迭代”,能“使用运算符'...' 在代码各处对实参包施加展开操作”;另外,能用sizeof...来得到参数的个数。

 

也就是说,必须只能逐层递归来处理各个参数,并且C++11中依然没有类似函数参数那样的直接取参数的宏va_list。

 

例1.1一个模板函数的错误例子

template <typename... Args>
void test(Args... args)
{
	cout<<args...<<endl;
}

例1.2一个模板函数的正确例子

template <typename T>
void myprintf(const char *s, T value)
{
	if(*s == '%'){
		cout << value <<endl;
	}
	return;
}

template <typename T, typename... Args>
void myprintf(const char *s, T value, Args... args)
{
	if(*s == '%'){
		cout << value << '\t';
		myprintf<Args>(s+1, args...);
	}
	return;
}


例1.1和例1.2对比,说明参数包必须被展开成typename T等原子类型使用。

 

未完待续...

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值