C++的模板(七):左值强制类型转换

C++中有个特殊指针类型,就是指向数据成员的指针。这个数据成员的指针是可以提取出来的。如:

class Whatever {
public:int x;int z;
};int  Whatever::*mp;
mp = &Whatever::x;

如果数据的访问权限是private,则这样不可以。但可以通过模板的办法挑出来:

class Whatever {int x;int z;
};template <class M, typename T, T M::*mp>
class Savein{
public:static void init() { x=mp; }static T M::*x;
};template class Savein<Whatever , int, &Whatever ::x>;
template<> int Whatever::* Savein<Whatever, int, &Whatever::x>::x;

这里必须通过template语法显式声明Savein<Whatever, int, &Whatever::x>这个类。显式声明可以避免访问权限问题。如果没有用这个语法显式实例化这个类,直接用Savein<Whatever , int, &Whatever ::x>仍会碰到访问权限的问题。这样做是妥当的,因为数据成员默认都是private的,如果模板不接受指向private的数据成员的指针,这个语言也就没有这种功能了。

这一步过关之后,可以通过Whatever类的对象或指针和拣出来这个x来访问类的私有数据了,这时已经是运行期问题了。运行期不受访问权限的影响。这也是提取指向数据成员的指针的目的。

Whatever w;
Savein<Whatever, int, &Whatever::x>::init();
w.*Savein<Whatever, int, &Whatever::x>::x =3;

当然这还是累。能不能把Savein的类变量挪到外面来呢?

static unsigned int offset;
template <class M, typename T, T M::*mp>
class Saveout{
public:static void init() { reinterpret_cast<T M::*&>(offset)=mp; }
};
template class Saveout<Whatever , int, &Whatever ::x>;

offset对应原来的类变量x。放到外面后offset不能带模板参数了,所以就让它成为整数值了。指向数据成员的指针概念上虽然复杂,实际内容不过是个记录偏移量的小整数。当然还是需要从mp赋值,但不能从mp转换。指向数据成员的指针,除了转换指向其它数据成员的指针,不能转换成别的类型。所以只能从左边想办法。转城右边类型的引用。这是C++特有的左值强制类型转换。

使用时这个offset再重新转换成数据成员的指针:

Whatever w;
Saveout<Whatever, int, &Whatever::x>::init();
w.*(int Whatever::*&)offset =3;

最后,因为offset 已经是整数类型了,可以对它进行调整,从而运行期访问其他数据成员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音运营_如何开抖店

截止20年8月&#xff0c;抖音的日活跃数高达6亿。 20年6月&#xff0c;上线抖店 &#xff08;抖音官方电商&#xff09; 一 抖店的定位和特色 1 一站式经营 帮助商家进行 商品交易、店铺管理、客户服务 等全链路的生意经营 2 多渠道拓展 抖音、今日头条、西瓜、抖音火山版…

科兴未来|2024年诸暨市海内外高层次人才创业大赛

为深入实施人才强市、创新强市首位战略,加快人才链、产业链、创新链深度融合,努力开创“诸才云集”生动局面,奋力打造新时代共同富裕新高地,高水平谱写社会主义现代化建设诸暨篇章,推动诸暨实现高水平建设&#xff0c;构建全新人才创业创新生态体系&#xff0c;助力人才流入诸暨…

【Python】用于发送电子邮件的标准库smtplib和构建邮件主体、添加附件、设置收件人的email

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 插件介绍邮件代码扩展知识点文章推荐 插件介绍 smtplib 是 Pytho…

海外媒体发稿的关键步骤和投稿策略:如何撰写高质量的新闻稿?国外软文发布平台有哪些?

发布国外新闻稿件是一个涉及多步骤的过程&#xff0c;旨在确保您的新闻稿能够有效覆盖目标受众。以下是一些关键步骤和实用的技巧&#xff0c;帮助你实现海外媒体发稿。 1. 明确目标和受众 首先&#xff0c;明确您发布新闻稿的目标&#xff0c;是为了增加品牌曝光、推出新产品…

惊呆了!企业数字化转型竟如工厂生产?

在众多使用蚓链数字化生态系统解决方案实现数字化转型的企业&#xff0c;你能想象吗&#xff1f;如今的企业数字化转型&#xff0c;就如同一家工厂的生产过程&#xff01;数据成为了原材料&#xff0c;而数据资源则是场景化的零件&#xff0c;最终生产出满足市场需求的数据产品…

基于Kafka的日志采集

目录 前言 架构图 资源列表 基础环境 关闭防护墙 关闭内核安全机制 修改主机名 添加hosts映射 一、部署elasticsearch 修改limit限制 部署elasticsearch 修改配置文件 启动 二、部署filebeat 部署filebeat 添加配置文件 启动 三、部署kibana 部署kibana 修…

2024-5-24

今日安排&#xff1a; 继续审计 nf_tables 源码 && iptables 相关学习♥♥♥♥♥复现 CTF 相关题目♥♥♥♥学习 winpwn♥♥♥♥mount 的使用&#xff0c;学习 namespace (昨昨昨昨昨昨昨昨昨昨昨昨昨昨天残留的任务)&#xff08;&#xff1a;看我能搁到什么时候♥♥♥…

21-信号集处理函数

屏蔽信号集 屏蔽某些信号 手动自动 未处理信号集 信号如果被屏蔽&#xff0c;则记录在未处理信号集中 非实时信号&#xff08;1~31&#xff09;&#xff0c;不排队&#xff0c;只留一个实时信号&#xff08;34~64&#xff09;&#xff0c;排队&#xff0c;保留全部 信号集…

springmvc中HandlerMapping是干什么用的

HandlerMapping处理器映射器 作用是根据request找到相应的处理器Handler和Interceptors&#xff0c;然后封装成HandlerExecutionChain对象返回 HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; 实现类 HandlerMapping帮助DispatcherServlet进…

【大数据面试题】30 Kafka如何保证数据可靠性

一步一个脚印&#xff0c;一天一道面试题。 数据可靠性一直是各个技术都需要的一个特性。不能在使用过程中数据被错误消费&#xff0c;多消费少消费&#xff0c;或者直接漏了数据。那就来看看热门消息队列 Kafka 在数据可靠性方面做了些什么。 Acknowledgment&#xff08;ACK&…

【AD21】BOM表文件的输出

BOM表文件通常发给采购&#xff0c;采购可以购买BOM表中所需的元器件。 在菜单栏中点击报告->Bill of Materials。 在以下界面&#xff0c;点击Columns&#xff0c;对输出的BOM表中一些说明进行不显示&#xff0c;可以不显示Description和LibRef。值&#xff0c;位号&#…

文心智能体【焦虑粉碎机】——帮你赶走“坏”情绪

目录&#xff1a; 引言1.登录 文心智能体平台2.创建智能体3.配置智能体&#x1f337; 头像设置&#x1f337; 名称设置&#x1f337; 简介设置&#x1f337;指令设置&#x1f337; 开场白设置&#x1f337; 引导示例设置 4.使用智能体 引言 随着ChatGPT的爆火&#xff0c;人工智…

【Python】 掌握 Flask 请求数据获取的艺术

基本原理 在Web开发中&#xff0c;Flask是一个用Python编写的轻量级Web应用框架。它被广泛用于快速开发简单的Web应用。当用户通过浏览器或其他客户端向服务器发送请求时&#xff0c;Flask需要能够接收和解析这些请求中的数据。这些数据可以是GET请求的查询字符串、POST请求的…

【3GPP核心网】【4G】LTE中S1-MME流程字段分析(四)

1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 承接上文 目录 15. S1 切入(23.401 5.5.2) 15.1 UTRAN Iu to E-UTRAN 15.2 GERAN Gb to E-UTRAN 16. S1切出(23.401 5.5.2) 16.1 E-UTRAN to UTRAN Iu 16.2 E-UTRAN…

Python列表推导式的实用指南

Python列表推导式的实用指南 一、引言 在Python编程中&#xff0c;列表推导式&#xff08;List Comprehension&#xff09;是一种简洁而强大的构造列表的方式。它允许我们在一行代码中&#xff0c;通过循环和条件语句快速生成列表。列表推导式不仅提高了代码的可读性和可维护…

【算法】分治 - 快速排序

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、颜色分类二、排序数组三、数组中的第k个数四、最小的k个数总结 引言 本节主要介绍快速排序&#xf…

swust oj 1012: 哈希表(链地址法处理冲突)

直接采用二维数组模拟实现 #include <iostream> using namespace std; const int N 100; int arr[N][N]; int point[N];//计数int main() {int m, n,data;cin >> m >> n;for (int i 0; i < n; i){cin >> data;int key data % m;arr[key][point[…

热点代码的优化技术

点代码的优化技术主要由Java虚拟机&#xff08;JVM&#xff09;中的即时编译器&#xff08;JIT&#xff09;来实现。以下是热点代码优化的一般流程和技术&#xff1a; 1、性能分析&#xff08;Profiling&#xff09;&#xff1a; JVM会跟踪应用程序的执行信息&#xff0c;收集…

对于高速信号完整性,一块聊聊啊(10)

本文包含的主要内容有: 过孔设计概述:从前面的各种基础知识到过孔设计,逐步对信号完整性有了初步了解,在过孔设计这里稍微做一个概述,也是个人的一些理解,算是一个小结。 过孔设计的必要性。 过孔结构的基础知识 实例:过孔设计仿真HFSS实例 过孔设计概述 通过前面…

几种混动汽车

混动汽车中的PHEV、HEV和REEV分别代表了不同的技术概念和类型&#xff0c;它们各自有其特点和区别。以下是关于这三种混动汽车的概念和它们之间的主要区别&#xff1a; PHEV&#xff08;插电式混合动力汽车&#xff0c;Plug-in Hybrid Electric Vehicle&#xff09; 概念&…