C++0x 学习笔记之 Variadic Templates(一)

2014-11-24 13:03:45 · 作者: · 浏览: 0

by feng

Variadic Templates 的引入,消去了烦冗的模板特化。
一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include
double do_sum()
{
return 0;
}
template < typename T, typename ... Args >
double do_sum( T&& t, Args&& ... args )
{
return t + do_sum( args... );
}
int main()
{
std::cout << do_sum( 1.0, 2.0, 3.0, 4.0 )
<< std::endl;
return 0;
}

这里需要注意的有两点:

  • double do_sum() 这个函数必须在变长模板函数 double do_sum( T&& t, Args&& … args ) 之前声明
  • 变长模板函数实现中必须使用另外一个函数递归实现

另外要看到,在变长模板函数声明中使用 … 的方法

  • 模板上用的是 template< typename… Args>
  • 函数参数中用的是 double do_sum(Arg … arg)
  • 函数体中用的是 do_sum(arg…)

大致可以看出,有 typename 的时候 .. 跟 typename 后边,否则跟在 Arg 后边,最后则是在参数 arg 后边

如果需要知道到底传入了多少个参数可以这样来

1
2
3
4
5
template < typename ... Args>
std:: size_t how_many_args(Args ... args)
{
return sizeof ...(args);
}

variadic template 基本使用到这里就差不多了,下边的内容略略而过即可

再次注意这个,来个稍微有点复杂的

1
2
3
4
5
6
7
8
template < typename ... T>
void f(T (* ...t)( int , <script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: Helper 类在Java和C++中的设计
下一篇: c++0x 学习笔记之 lambda
相关文章
『21天精通C++』第一周学习笔记
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=89769&catid=339&title=QysrMHgg0afPsLHKvMfWriBWYXJpYWRpYyBUZW1wbGF0ZXM=&forward=http://www.2cto.com/kf/201105/89769.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");
排行
热门