当前位置: 首页 > news >正文

定义宏,字符串、枚举、接口类绑定

在项目中,有一些接口处理类,比如

"value1"对应的类处理使用class Cvalue1

"value2"对应的类处理使用class Cvalue2

使用 X-Macros 技术能够很大程度上帮助我们,减少代码量并且使得代码简洁。

如果我们需要对每一个字符串“value1”,“value2”,“value3”,“value4”....都做一个判断,然后new出它对应的Cvaluen处理函数,这对代码整洁度将是一种灾难性的。

使用  X-Macros 将帮助我们处理这类问题。

下面是给出的案例代码

#include <stdio.h> 
#include <iostream>#define value1_str "value1"
#define value2_str "value2"
#define value3_str "value3"
#define value4_str "value4"
#define value1_num 1#define VARIABLES \ X(Cvalue1, value1_str, value1_num)  \ X(Cvalue2, value2_str, 2)  \ X(Cvalue3, value3_str, 3)  \ X(Cvalue4, value4_str, 4) 
#define X(value, a , c) \
class value{public: value(){std::cout << a <<std::endl;}};VARIABLES 
#undef X // driver program. 
int main(void) 
{ std::string strType="value1";int nType = 0;#define X(value, a , c) \if (strType == std::string(a)){ nType = c; new value();}VARIABLES #undef X else{}std::cout << nType << std::endl;return 0; 
} 

需要了解预处理指令:这样就能够在a.i文件中看到预处理后的代码。

g++ -E main.cpp >a.i

代码解析:

#define value1_num 1#define VARIABLES \ X(Cvalue1, value1_str, value1_num)  \ X(Cvalue2, value2_str, 2)  \ X(Cvalue3, value3_str, 3)  \ X(Cvalue4, value4_str, 4) 

这里是定义的 X 宏,他们能够绑定处理类,字符串,对应的代号。这里的代号使用数字或者宏都是允许的。

#define X(value, a , c) \
class value{public: value(){std::cout << a <<std::endl;}};VARIABLES 
#undef X 

这样写它对应的预处理代码是:

class Cvalue1{public: Cvalue1(){std::cout << "value1" <<std::endl;}};
class Cvalue2{public: Cvalue2(){std::cout << "value2" <<std::endl;}}; 
class Cvalue3{public: Cvalue3(){std::cout << "value3" <<std::endl;}}; 
class Cvalue4{public: Cvalue4(){std::cout << "value4" <<std::endl;}};

当然,实际生产环境中不允许这样创建类的,毕竟每一种接口处理的方式不尽相同,但是这些接口创建对象的时候的语句是差不多的。

	std::string strType="value1";int nType = 0;#define X(value, a , c) \if (strType == std::string(a)){ nType = c; new value();}VARIABLES #undef X else{}std::cout << nType << std::endl;

这里是判断如果strType 等于 X 宏的第二个数,则创建 X 宏的第一个参数,在最开始绑定的时候第一个参数是类名称。

第三个参数有什么用?他是一个整数,可以赋值给其他需要的变量,比如方便使用Switch这种语句。

它对应的预处理代码是:

 std::string strType="value1";int nType = 0;
if (strType == std::string("value1")){ nType = 1; new Cvalue1();} 
if (strType == std::string("value2")){ nType = 2; new Cvalue2();} 
if (strType == std::string("value3")){ nType = 3; new Cvalue3();} 
if (strType == std::string("value4")){ nType = 4; new Cvalue4();}std::cout << nType << std::endl;

这种操作可以很大的帮助我们节省代码量,使得代码变得整洁,带来的坏处,可能是造成代码的可读性变差,可调试性变差。当你的处理流程相对固定,并且处理接口超过5个时可以考虑使用这种方式。当然这里只是很简短的处理流程,必须在可控的范围内使用。

相关文章:

定义宏,字符串、枚举、接口类绑定

在项目中&#xff0c;有一些接口处理类&#xff0c;比如 "value1"对应的类处理使用class Cvalue1 "value2"对应的类处理使用class Cvalue2 使用 X-Macros 技术能够很大程度上帮助我们&#xff0c;减少代码量并且使得代码简洁。 如果我们需要对每一个字…...

盘点30个Python树莓派源码Python爱好者不容错过

盘点30个Python树莓派源码Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1LA4cLunntKW3qO5aok3xAQ?pwd8888 提取码&#xff1a;8888 项目名称 PiCar-raspber…...

「Verilog学习笔记」用优先编码器①实现键盘编码电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 用此编码器实现键盘的编码电路。 注意&#xff1a;编码器的输出是低电平有效&#xff0c;而键盘编码电路输出的是正常的8421BCD码&#xff0c;是高电平有效。因此将编…...

APT攻击的特点及含义

APT&#xff08;高级持续性威胁Advanced Persistent Threat&#xff09;攻击是一种高级、持续性的攻击模式&#xff0c;通过先进的攻击手段对特定目标进行长期持续性的网络攻击&#xff0c;一般针对拥有敏感数据的大型企业及重要机构。 APT攻击的特点 一、目标性强 APT攻击并…...

使用html2canvas插件进行页面截屏

使用纯html实现过程 <!DOCTYPE html> <html><head><title>使用html2canvas生成网页截图</title><script src"https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script> </head><body><h1>…...

Java --- JVM的执行引擎

目录 一、执行引擎概述 1.1、执行引擎的工作过程 二、Java代码编译和执行的过程 三、解释器 3.1、解释器工作机制 3.2、解释器分类 3.3、解释器现状 四、JIT编译器 五、热点代码及探测方式 六、方法调用计数器 6.1、热点衰减 七、回边计数器 八、HotSpot VM设置程序…...

前端学习笔记--node.js

Node Node 可以理解成 ECMAScript 内置的模块组成的&#xff0c;引用第三方模块&#xff0c; npm系统 node package manager。 node是基于js的&#xff0c;前端来写服务端通过node是最方便的&#xff0c;node的性能问题 内部采用的多线程。 node中主线程还是单线程的 &#…...

DB2 常用命令及SQL语句

前言 DB2数据库是由IBM开发的关系型数据库管理系统&#xff08;RDBMS&#xff09;。它是一种功能强大、可扩展和可靠的数据库解决方案&#xff0c;用于存储和管理企业级应用程序的数据。 以下是一些关于DB2数据库的重要信息和特点&#xff1a; 数据模型&#xff1a;DB2数据库…...

spring-boot-starter-data-redis2.X连接redis7

由于redis7引入了acl机制&#xff0c;可以配置用户权限&#xff0c; 比如配置了一个普通用户 test&#xff0c;权限为 test_ 前缀的key可操作 springboot想要连接&#xff0c;并没有设置用户名的地方&#xff0c; 跟了源码&#xff0c;jedis客户端是支持的&#xff0c;但是s…...

PHP中$_SERVER全局变量

在PHP中&#xff0c;$_SERVER 是一个全局数组变量&#xff0c;它包含了有关服务器和当前脚本的信息。$_SERVER 数组中的每个元素都是服务器环境的一个参数&#xff0c;如请求的方法、请求的 URI、客户端 IP 地址等。 PATH 系统环境变量的值&#xff0c;包含了多个目录的路径…...

【ML】欠拟合和过拟合的一些判别和优化方法(吴恩达机器学习笔记)

吴恩达老师的机器学习教程笔记 减少误差的一些方法 获得更多的训练实例——解决高方差尝试减少特征的数量——解决高方差尝试获得更多的特征——解决高偏差尝试增加多项式特征——解决高偏差尝试减少正则化程度 λ——解决高偏差尝试增加正则化程度 λ——解决高方差 什么是…...

服务器数据恢复—服务器发生故障导致数据丢失如何恢复服务器数据?

服务器常见故障&#xff1a; 硬件故障&#xff1a;磁盘、板卡、电源故障等。 软件故障&#xff1a;操作系统崩溃、程序运行错误等。 入侵破坏&#xff1a;加密、删除服务数据等。 不可控力&#xff1a;浸水、火烧、倒塌等。 误操作&#xff1a;格式化、删除、覆盖等。 如何减少…...

SLAM中提到的相机位姿到底指什么?

不小心又绕进去了&#xff0c;所以掰一下。 以我个人最直观的理解&#xff0c;假设无旋转&#xff0c;相机在世界坐标系的(5,0,0)^T的位置上&#xff0c;所谓“位姿”&#xff0c;应该反映相机的位置&#xff0c;所以相机位姿应该如下&#xff1a; Eigen::Matrix4d T Eigen::M…...

《视觉SLAM十四讲》-- 后端 1(上)

文章目录 08 后端 18.1 概述8.1.1 状态估计的概率解释8.1.2 线性系统和卡尔曼滤波&#xff08;KF&#xff09;8.1.3 非线性系统和扩展卡尔曼滤波&#xff08;EKF&#xff09;8.1.4 小结 08 后端 1 前端视觉里程计可以给出一个短时间内的轨迹和地图&#xff0c;但由于不可避免的…...

南昌市西湖区棒球特色规划

西湖区棒球特色学校打造方案 一、项目背景 南昌市西湖区作为江西省的教育强区&#xff0c;一直致力于发展特色教育。近年来&#xff0c;棒球运动逐渐受到广泛关注&#xff0c;西湖区决定将棒球运动作为特色项目&#xff0c;打造一所具有国际水平的棒球特色学校。 二、目标与…...

nginx启动命令

普通启动 切换到nginx安装目录的sbin目录下&#xff0c;执行&#xff1a;./nginx 通过配置文件启动 ./nginx -c /usr/local/nginx/conf/nginx.conf /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 其中-c是指定配置文件,而且配置文件路径必须指定绝对路…...

防爆五参数气象仪的科技力量

WX-FBQ2 随着科技的不断进步&#xff0c;气象监测设备也在不断升级和完善。 防爆五参数气象仪是一种可以同时监测温度、湿度、压力、风速和风向五个基本气象参数的仪器。它采用了气象监测技术&#xff0c;不仅可以实时监测气象数据&#xff0c;还可以对数据进行分析和处理。 …...

J. Chem. Theory Comput. | AI驱动的柔性蛋白-小分子复合物建模

今天为大家介绍的是来自陈语谦教授团队发表在Journal of Chemical Theory and Computation的论文&#xff0c;“Equivariant Flexible Modeling of the Protein−Ligand Binding Pose with Geometric Deep Learning”&#xff0c;博士生董铁君为第一作者。该文提出了一种新的AI…...

数据库sql语句设置外键

当我们需要在数据库表之间建立关联关系时&#xff0c;可以使用外键&#xff08;Foreign Key&#xff09;来实现。在 SQL 中&#xff0c;外键可以用来保持数据的完整性&#xff0c;并帮助我们更有效地管理数据。以下是设置外键的步骤&#xff1a; 1.在创建表时&#xff0c;需要…...

excel在函数中插入函数

例如&#xff0c;要计算RAND()1的值&#xff0c;其中RAND()表示取0~1之间的随机数。 插入-》函数&#xff1a; 选SUM函数&#xff1a; 点击“继续”&#xff1a; 将光标先放在数字1中的输入框中&#xff0c;然后在左边过滤出RAND函数&#xff0c;并且点击继续&#xff1…...

Windows 11终极优化指南:用Win11Debloat实现系统加速51%的免费方案

Windows 11终极优化指南&#xff1a;用Win11Debloat实现系统加速51%的免费方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...

别再手动记数据了!用MATLAB脚本自动读取串口,5分钟搞定数据采集

别再手动记数据了&#xff01;用MATLAB脚本自动读取串口&#xff0c;5分钟搞定数据采集 还在用串口助手手动记录数据&#xff1f;每次实验都要盯着屏幕抄写数值&#xff0c;不仅效率低下&#xff0c;还容易出错。想象一下&#xff1a;当你正在进行长达数小时的温度监测实验&…...

uniapp学习9,同时兼容h5和微信小程序的百度地图组件

H5端微信小程序端&#xff1a;manifest.json配置 "mp-weixin" : {"appid" : "你的微信小程序appid","setting" : {"urlCheck" : false},"usingComponents" : true,"permission": {"scope.userLoca…...

CES Asia 2026打造低空经济生态圈:从整机到核心部件全链覆盖

北京&#xff0c;2026年3月31日电——低空经济产业正迈向全链协同、规模化落地的关键阶段。CES Asia 2026将于6月10—12日在北京举办&#xff0c;以全产业链覆盖精准供需对接资本赋能为核心&#xff0c;构建从整机到核心部件的完整低空经济生态圈&#xff0c;助力企业一站式打通…...

极客玩法:OpenClaw+Qwen3-14B控制智能家居实战

极客玩法&#xff1a;OpenClawQwen3-14B控制智能家居实战 1. 为什么选择OpenClaw控制智能家居&#xff1f; 去年装修新房时&#xff0c;我给自己定了个小目标&#xff1a;所有智能设备必须能通过自然语言控制。市面上的语音助手总让我觉得"差点意思"——要么响应慢…...

ArcGIS 批量出图实战:15 分钟搞定 15 省地图自动化生成

&#x1f680;ArcGIS 批量出图实战&#xff1a;15 分钟搞定 15 省地图自动化生成 ✨GISer 效率神器&#xff01;告别重复操作&#xff0c;一键批量生成省级专题地图✨ 作为 GIS 从业者&#xff0c;你是不是也经常遇到这样的场景&#xff1a;&#x1f4cb;要给十几个省份分别制作…...

SWIFT报文格式规范:从字符约束到金融交易安全的深度解析

1. SWIFT报文格式规范的核心价值 第一次接触SWIFT报文时&#xff0c;我被那些看似简单的字母代号震撼到了——谁能想到&#xff0c;像"2!n"这样简单的符号组合&#xff0c;竟然承载着全球金融系统的运转规则&#xff1f;在跨境汇款中输错一个字符可能导致资金滞留数周…...

Vue2项目构建优化实战:时间戳防缓存与资源压缩的配置详解

1. 为什么Vue2项目需要构建优化 最近接手了一个老项目的维护工作&#xff0c;发现每次前端更新后总有用户反馈页面显示异常。排查后发现是浏览器缓存惹的祸——用户访问的仍然是旧版本的静态资源。这让我意识到构建优化的重要性&#xff0c;特别是对于需要频繁更新的业务系统。…...

AI开发AI:借助快马多模型能力,迭代式构建你的智能健康管理Agent

最近在尝试开发一个健康管理AI助手&#xff0c;发现用传统方式写代码调试特别耗时。后来尝试了InsCode(快马)平台&#xff0c;发现用AI对话的方式迭代开发简直打开了新世界。记录下这个"用AI开发AI"的完整过程&#xff1a; 基础框架搭建 最开始只需要一个能交互的对话…...

豪鹏科技2025年财报透视:毛利率提升5.2个百分点,费用管控成效显著

豪鹏科技2025年财报透视&#xff1a;毛利率提升5.2个百分点&#xff0c;费用管控成效显著豪鹏科技2025年业绩表现亮眼&#xff0c;全年实现营业收入57亿元至60亿元&#xff0c;同比增长11.58%至17.45%&#xff1b;归母净利润1.95亿元至2.2亿元&#xff0c;同比大幅增长113.69%至…...