当前位置: 首页 > 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个时可以考虑使用这种方式。当然这里只是很简短的处理流程,必须在可控的范围内使用。

http://www.lryc.cn/news/230946.html

相关文章:

  • 盘点30个Python树莓派源码Python爱好者不容错过
  • 「Verilog学习笔记」用优先编码器①实现键盘编码电路
  • APT攻击的特点及含义
  • 使用html2canvas插件进行页面截屏
  • Java --- JVM的执行引擎
  • 前端学习笔记--node.js
  • DB2 常用命令及SQL语句
  • spring-boot-starter-data-redis2.X连接redis7
  • PHP中$_SERVER全局变量
  • 【ML】欠拟合和过拟合的一些判别和优化方法(吴恩达机器学习笔记)
  • 服务器数据恢复—服务器发生故障导致数据丢失如何恢复服务器数据?
  • SLAM中提到的相机位姿到底指什么?
  • 《视觉SLAM十四讲》-- 后端 1(上)
  • 南昌市西湖区棒球特色规划
  • nginx启动命令
  • 防爆五参数气象仪的科技力量
  • J. Chem. Theory Comput. | AI驱动的柔性蛋白-小分子复合物建模
  • 数据库sql语句设置外键
  • excel在函数中插入函数
  • 保姆级前端翻牌效果(CSS)
  • Mac环境配置的相关知识
  • 业务连续性:确保稳健运营的关键战略
  • 【Pytorch和深度学习】栏目导读
  • sklearn笔记:neighbors.NearestNeighbors
  • V-for中 key 值的作用,如何选择key
  • linux内核驱动开发
  • 2.3.5 交换机的VRRP技术
  • Knowledge Graph Reasoning with Relational Digraph
  • 力扣203:移除链表元素
  • Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享