c++0x 可变参数模板

2024-01-24 17:48
文章标签 模板 c++ 参数 可变 0x

本文主要是介绍c++0x 可变参数模板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++ 11 tuple & 可变参数模板

人是生而的,但却无往不在枷锁之中。自认为是其他一切的主人的人,反而比其他一切更是奴隶。      C++ 11中引入的tuple是一个N元组。它相当于有N个成员的布局体,只不过这个布局体的成员都是匿名的。tuple中有两个特别的函数,一个是head(),用于获取第一个成员的值,另一个是tail(),用于获取剩下所有成员的值,tail()本身又是一个tuple。如许,若是我们想取tuple中第二个成员的值,则可以先取tail()的值,再取tail()的head()的值。当然,如许应用的话斗劲麻烦,所以C++ 11供给了get函数经由过程索引来获取tuple中某个成员的值。别的,经由过程make_tuple可以很便利地机关一个tuple对象。有关tuple应用的例子可以参考下面的代码。

1  tuple< int,  char,  string> tupInfo( 10,  "" A "",  " hello world ");
2   int a = tupInfo.head();
3   int a2 = tupInfo.tail().head();
4  tuple< char,  string> tupTail = tupInfo.tail();
5   int b =  get< 0>(tupInfo);
6   char c =  get< 1>(tupInfo);
7   string s =  get< 2>(tupInfo);
8  auto tupInfo2 = make_tuple( 5,  "" B "",  string" C++ 11 "),  4.6);

谚语是一人的妙语,世人的聪明      前面说过,tuple是一个N元组,而N的个数是没有限制的,也就是说,tuple可以包含0个、1个、2个或更多的元素,每个元素的类型则经由过程模板参数指定。那么,tuple是如何做到这些的呢?答案是可变参数模板。
      进修C++的人该当对printf函数都很是熟悉,printf的一个特点就是它的参数个数是可变的。而在C++ 11中,则容许模板的参数个数也是可变的。下面是一个模板参数可变的函数模板,用于获取传入的参数的个数。

1 template<typename... Args>
2 UINT GetParameterCount(Args... args)
3 {
4   return  sizeof...(args);
5 }

      可以看到,可变参数模板应用typename再加...来默示模板参数包,应用Args再加...来默示函数参数包。上方代码中的sizeof...专门用于获取函数参数包中参数的个数,它的参数必须是一个函数参数包类型的对象。熟悉了可变参数模板的根蒂根基语法后,下面我们应用它来编写一个Print函数,该函数的参数个数和类型都是可变的,它简单地输出传入的各个参数的值,值之间用逗号进行分别,并在输出最后一个参数的值后主动换行。

 1 template<typename T>
 2  void Print(T value)
 3 {
 4  cout << value << endl;
 5 }
 6 
 7 template<typename Head, typename... Rail>
 8  void Print(Head head, Rail... rail)
 9 {
10  cout << head <<  " ";
11  Print(rail...);
12 }
13 
14  int main( int argc,  char *argv[])
15 {
16  Print( 1);                   //  输出:1
17   Print( 1,  " hello ");          //  输出:1,Hello
18   Print( 1,  " hello ",  "" H "");     //  输出:1,Hello,H
19    return  0;
20 }

       在上方的代码中,我们先定义了一个只有一个模板参数的函数模板,它简单地输出传入的参数的值。然后又定义了一个可变参数的函数模板,它输出第一个参数的值,然后递归地调用本身。重视rail...这种写法,它默示将函数参数包分别成一个一个的参数,并传入Print中。如许,函数参数包中的第一个参数传递给head,残剩的参数又从头构成一个函数参数包传递给rail。当递归调用到函数参数包中只有一个参数时,则会调用只有一个模板参数的Print函数。
      懂得了可变模板参数的应用道理后,我们再来编写一个本身的Printf函数。

 1  void MyPrintf( const  char *pszText)
 2 {
 3  assert(pszText != NULL);
 4 
 5  cout << pszText;
 6 }
 7 
 8 template<typename T, typename... Args>
 9  void MyPrintf( const  char *pszText, T value, Args... args)
10 {
11  assert(pszText != NULL);
12 
13   while (*pszText)
14  {
15    if (*pszText ==  "" "" && *++pszText !=  "" ""
16   {
17    cout << value;
18    MyPrintf(++pszText, args...);
19     return;
20   }
21   cout << *pszText++;
22  }
23 }

      调用MyPrintf函数时的推理过程与Print的推理过程类似,这里就不再赘述了。别的,若是想更深切地进修可变参数模板,还可以参阅tuple的源代码,或者本身下手实现一个简化版的tuple。

 

      介绍C++ 11新特点的文章列表:

          1、【原】C++ 11右值引用

          2、【原】C++ 11 Lambda表达式

          3、【原】C++ 11 auto & decltype
          4、【原】C++ 11完美转发

          5、【原】C++ 11语法甜点

          6、【原】C++ 11 tuple & 可变参数模板卢梭

《更多网站建设信息、网站开发资讯,敬请咨询百微信息科技,021-57700304》


  • 面向对象软件设计原则(三) —— 软件实体的设计原则
  • rails 与 mysql 5.X for win不兼容
  • 【第六章】 AOP 之 6.7 通知次序 ——跟我学spring3 【私塾在线原创】
  • python懂得-对象类型
  • 标准设备的UBUNTU 11.10 RUBY VMWARE 镜像,手工MOD(ZSH_RVM_RAILS_VIM)
  • 面向对象软件设计原则(二) —— 软件设计的堕落
  • 空行引起的祸端
  • 浏览文件夹对话框初始化时选中所指目次




这篇关于c++0x 可变参数模板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640481

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1