ATL中__if_exists的替代方案

news2024/11/14 16:35:03

__if_exists 和 __if_not_exists 是什么?

__if_exists 和 __if_not_exists 是微软 ATL (Active Template Library,活动模板库) 中的关键字,可以用来在编译期间测试一个标识符是否存在。如果该标识符存在,则其关联的语句将会被执行。
__if_exists 和 __if_not_exists 可以用在变量,函数,typedef 以及其他标识符上。
关于这个关键字的使用和潜在的误用,可以参考 Raymond Chen 的相关博客。

为什么你不应该使用 __if_exists 和 __if_not_exists
尽管这些关键字看起来很有用,但它们多年来一直存在问题。 此外,__if_exists 和 __if_not_exists 也与推荐的编译器 /permissive- switch 不兼容,后者指定了符合标准的编译器行为,因此它们也不能与新的 C++20 模块功能一起使用。

替代方案

从 Visual Studio 2022 17.2 预览版 3 开始,由于带有 /permissive- (模块需要!)的 MSVC 不支持__if_exists,因此 ATL 有一个新的宏 — _ATL_MODULES — 它将替换如下所示的代码:

__if_exists(m_nAccessors)

替代为:

if constexpr(_Has_m_nAccessors<_Self>::value)

默认情况下,你仍然可以使用 __if_exists 和 __if_not_exists,并且可以使用旧的 ATL 代码,但如果要使用现代 /permissive- 编译器模式,则需要切换。请注意,仅 c++ 17 及更高版本支持此功能。

ATL中宏的更改

某些 ATL 宏受到删除__if_exists的影响。请注意以下更改:
> 现在有两个版本的 BEGIN_PROPERTY_MAP 和 BEGIN_PROP_MAP:*
_WITHOUT_ATL_PROP_NOTIFY_EVENT_CLASS_TYPEDEF 应该在没有 typedef _ATL_PROP_NOTIFY_EVENT_CLASS的类中使用;*_WITH_ATL_PROP_NOTIFY_EVENT_CLASS 版本应该存在_ATL_PROP_NOTIFY_EVENT_CLASS typedef 的类中使用。


> DECLARE_REGISTRY_RESOURCE,
DECLARE_REGISTRY_RESOURCE_ID – 这些宏具有新版本。


> WITH_MODULE 应该在存在名为 _Module 的全局变量(属于 CComModule 的子类型)时使用


> 当没有此类全局变量可用时,应使用WITHOUT_MODULE版本。


> V2 版本:为了使新宏模拟原始__if_exists行为,我们需要知道包含类的名称。以前版本的宏使用非标准 MSVC 特定的扩展执行此操作。 新版本要求用户将包含类的名称传递给宏。 用户应尽可能使用 V2 版本。


>
BEGIN_CONNECTION_POINT_MAP,BEGIN_ATTRCONNECTION_POINT_MAP – 这些宏定义 typedef _atl_conn_classtype(如果尚未定义)。由于我们无法检测它是否已存在,因此现在这些宏有两个版本:


> *
_WITHOUT_ATL_CONN_CLASSTYPE_TYPEDEF 如果没有_atl_conn_classtype typedef ,则应使用


> *
_WITH_ATL_CONN_CLASSTYPE_TYPEDEF 应该在已经存在 _atl_conn_classtype typedef 的类中使用

为什么应该使用带有 _ATL_MODULES 标志的 ATL
最重要的原因是:ATL 现在可以与头文件单元一起使用了。

总结

这些巨型宏看起来挺复杂,但我们应该追随趋势,不能和趋势作对。
既然老大哥说让我们改,我们最好还是照办。
另外一个方法是:完全不使用 ATL,自己造轮子。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《An alternative to __if_exists in ATL》

 

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

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

相关文章

2023年3月软考中级(系统集成项目管理工程师)报名走起!!!

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

【Vue】Vue常见的6种指令

Vue的6种指令-前言指令&#xff08;Directives&#xff09;是vue 为开发者提供的模板语法&#xff0c;用于辅助开发者渲染页面的基本结构。vue 中的指令按照不同的用途可以分为如下6 大类① 内容渲染指令 ② 属性绑定指令 ③ 事件绑定指令 ④ 双向绑定指令 ⑤ 条件渲染指令 ⑥ …

Fortinet设备审计

作为网络安全领域的领导者&#xff0c;Fortinet提供了多种网络安全解决方案&#xff0c;包括下一代防火墙&#xff0c;即FortiGate。通过EventLog Analyzer的FortiGate预定义报表以及其他Fortinet应用程序的详尽列表&#xff0c;充分发挥Fortinet设备的最大作用。FortiGate您的…

粒子群算法

粒子群算法1 粒子群算法介绍2 基本思想3 算法流程4 代码实现1 粒子群算法介绍 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想是通过…

我建议,专家不要再建议了

作者| Mr.K 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)关于买房&#xff0c;专家建议&#xff1a;不建议掏空六个钱包凑首付。&#xff08;网友&#xff1a;丈母娘等不到我自己挣够&#xff09;关于农村剩男多&#xff0c;城市剩女多&#xff0c;专家建议&am…

Adobe illustrator学习笔记

Adobe illustrator学习笔记 生命有限&#xff0c;设计无限 学习Adobe illustrator主要是用来制作SVG图片去制作字体图标&#xff0c;因此笔记内容大多会围绕SVG展开。 2023-3-5 1、Adobe illustrator简介 主要用于制作矢量图和插图 2、颜色模式介绍 显示颜色&#xff1a;RGB…

EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数

1 公式计算后的数&#xff0c;用只粘贴数值后&#xff0c;后面自动多了 0.0001&#xff0c;导致不再是整数的问题 问题入戏 见第1个8400&#xff0c;计算时就出现了问题&#xff0c;按正常&#xff0c;这里8400应该是整数&#xff0c;而不应该带小数&#xff0c;但是确实就计…

我不写单元测试,被批了

我是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手最近在看单元测试的东西&#xff0c;想跟大家聊聊我的感受。单元测试这块说实在的&#xff0c;我并不太熟悉&#xff0c;我几乎不写单元测试&#xff…

项目中维护一个随时更新的ui库的解决方案之一(uniapp+uview-plus)

1. 环境准备 需要准备两个仓库&#xff0c;第一个仓库用来存uniapp项目的相关代码&#xff0c;第二个用来存放uview-plus UI库的代码&#xff08;第二个仓库的仓库名称为uview-plus&#xff09; 2. 项目结构 我们uniapp目录结构大致如下 我们维护的ui组件应该是uni_modules下…

详解JAVA类加载器

目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念&#xff1a; 类加载器&#xff08;Class Loader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一个重要组件&#xff0c;负责加载Java类到内存中并使其可以被JVM执行。类…

抢先看!界面控件DevExtreme 2023产品路线图曝光

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

【C++】优先级队列 priority_queue,仿函数和函数对象,反向迭代器

目录 1.介绍和实现 2.仿函数和函数对象 3.oj 4.反向迭代器 1.介绍和实现 他也在<queue>的头文件里 但是他的底层是堆&#xff0c;并不满足先入先出&#xff08;不要一看到queue就先入先出&#xff09; 他也是一个容器适配器&#xff0c;用vector适配的&#xff0c;为…

利用Qemu工具仿真ARM64平台

Windows系统利用Qemu仿真ARM64平台0 写在最前1 Windows安装Qemu1.1 下载Qemu1.2 安装Qemu1.3 添加环境变量1.4测试安装是否成功2. Qemu安装Ubuntu-Server-Arm-642.1 安装前的准备2.2 安装Ubuntu server arm 64位镜像3 Windows配置Qemu网络和传输文件3.1 参考内容3.2 Windows安装…

数据湖架构Hudi(五)Hudi集成Flink案例详解

五、Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址&#xff1a; https://archive.apache.org/dist/flink/ HudiSupported Flink version0.12.x1.15.x、1.14.x、1.13.x0.11.x1.14.x、1.13.x0.10.x1.13.x0.9.01.12.2 将上述编译好的安装包拷贝到flink下的jars目录…

Python(青铜时代)——字符串

字符串的定义与操作 字符串就是 一串字符 &#xff0c;是编程语言中表示文本的数据类型 在Python中使用一对双引号 "" 或者一对单引号来定义. 使用索引获取一个字符串中 指定位置的字符&#xff0c;索引计数从0开始 可以用 for/while 循环遍历字符串中的每一个字符…

NGINX学习笔记(一):一篇了解NGINX的基本概念

NGINX是什么&#xff1f; NGINX是一款由俄罗斯人伊戈尔赛索耶夫使用C语言开发的、支持热部署的、轻量级的WEB服务器/反向代理服务器/电子邮件代理服务器&#xff0c;因为占用内存较少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;所以在互联网项目中广泛应用。可…

CRM系统的四种数据分析法

在数字化时代&#xff0c;数据就是一切。因此&#xff0c;通过数据来支撑企业决策&#xff0c;才能确保制定的决策在更大程度上保持准确。因此&#xff0c;CRM客户管理系统的数据分析能力不容忽略。CRM获取的客户信息&#xff0c;就是很好的数据支撑样本&#xff0c;让企业从数…

CANfd 一次采样点和二次采样点

CANfd 一次采样点和二次采样点 采样点的定义 采样点是CAN控制器读取总线电平&#xff0c;并解释各个比特的逻辑值的时间点。 首先我们需要了解Tq的概念&#xff0c;Tq是can控制器的最下时间周期称作时间份额&#xff08;Time quantum&#xff0c;简称Tq&#xff09;,它是通过芯…

2023年3月全国DAMA-CDGA/CDGP数据治理认证招生简章

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…

嵌入式学习笔记——认识STM32的 GPIO口

寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图&#xff08;重点&#xff09;输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻&#xff08;可配置&#xff09;3.施密特触发器4.输入数…