成都网站建设设计

将想法与焦点和您一起共享

C++11可变参数模板的参数转发举例分析

本篇内容主要讲解“C++11可变参数模板的参数转发举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11可变参数模板的参数转发举例分析”吧!

成都创新互联公司是一家专业提供沙洋企业网站建设,专注与做网站、成都网站设计、H5开发、小程序制作等业务。10年已为沙洋众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

实例

很多软件系统都存在日志(log)功能,通过日志信息可以确认系统的状态和动作的过程。日志大多是文本形式的。虽然很方便,但是碍于文本形式本身的局限性,存储过程中会发生信息的丢失。

本文实现一个可以保存多种信息的信息存储类。

C++11可变参数模板的参数转发举例分析

Segment是一个抽象类,定义了信息片段的基本形态,代码如下:

C++11可变参数模板的参数转发举例分析

由于只是一个雏形,目前只是定义了一个output操作并重载了输出运算符。目的是为了以文本形式输出信息的内容。

接下来是两个派生类,分别用于存储整数信息和字符串信息。

C++11可变参数模板的参数转发举例分析

IntSegment类的内容很简单,这里省略说明。

StringSegment类需要注意的是:构造函数有两个版本,分别对应左值引用参数和右值引用参数。当参数类型为左值引用时,m_msg成员执行拷贝构造函数;当参数类型为右值引用时,m_msg成员执行移动构造函数。

最后是MsgHolder类。

C++11可变参数模板的参数转发举例分析

MsgHolder类使用一个vector来保存信息片段,使用output配合输出运算符输出文本形式的信息。

MsgHolder还另外提供了三个add函数模板,前两个固定参数的add方法用于创建IntSegment和StringSegment对象,可变参数的方法用于接受不特定多数的参数并转发。

可变参数模板参数转发

和固定参数模板函数同样,可变参数模板同样会发生引用合并,所以在模板参数传递的过程中,也使用了std::forward。其用法如下:

add(std::forward(rest)...);

MsgHolder用法示例

上述准备工作完成后,就可以使用它们了。示例代码如下:

C++11可变参数模板的参数转发举例分析

在add方法中,分别投入了整数,字符串常量,左值引用和右值引用。对于每一种情况都产生了正确的输出;在右值引用的场合也发生了移动操作。

也就是说,使用者希望继续使用字符串时(ltest的情况),就正常传递该参数,这时存储字符串的拷贝;使用者明确不再需要某个字符串时(rtest的情况),使用std::move通知给编译器,这时存储的就是字符串本身而不会发生拷贝动作。

如果没有正确使用std::forward的话,右值引用的部分就无法正常动作。无论哪种情况都会发生字符串拷贝。

关于扩展信息存储类的扩展

目前的MsgHolder还只是一个雏形,您可以增加Segment的派生类以扩展支持的数据类型;也可以增加输出方法以提供其他形式的输出。

到此,相信大家对“C++11可变参数模板的参数转发举例分析”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


当前文章:C++11可变参数模板的参数转发举例分析
本文链接:http://chengdu.cdxwcx.cn/article/igehij.html