文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-19 10:52

关注

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

实例

很多软件系统都存在日志(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<Args>(rest)...);

MsgHolder用法示例

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

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

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

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

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

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

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯