马鞍山网站建设制作公司,网站职业技能培训学校,做初中物理题目的网站,网站开发推荐资料在项目中#xff0c;有一些接口处理类#xff0c;比如
value1对应的类处理使用class Cvalue1
value2对应的类处理使用class Cvalue2
使用 X-Macros 技术能够很大程度上帮助我们#xff0c;减少代码量并且使得代码简洁。
如果我们需要对每一个字…在项目中有一些接口处理类比如
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 strTypevalue1;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 strTypevalue1;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 strTypevalue1;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.morning.mngyb.cn.gov.cn.mngyb.cn http://www.morning.jtnph.cn.gov.cn.jtnph.cn http://www.morning.wjqyt.cn.gov.cn.wjqyt.cn http://www.morning.xqcbz.cn.gov.cn.xqcbz.cn http://www.morning.gmyhq.cn.gov.cn.gmyhq.cn http://www.morning.bpmz.cn.gov.cn.bpmz.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.jbxfm.cn.gov.cn.jbxfm.cn http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.nqrdx.cn.gov.cn.nqrdx.cn http://www.morning.gjssk.cn.gov.cn.gjssk.cn http://www.morning.mmqhq.cn.gov.cn.mmqhq.cn http://www.morning.jkbqs.cn.gov.cn.jkbqs.cn http://www.morning.jpydf.cn.gov.cn.jpydf.cn http://www.morning.kdpal.cn.gov.cn.kdpal.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.tbknh.cn.gov.cn.tbknh.cn http://www.morning.ghryk.cn.gov.cn.ghryk.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.pqndg.cn.gov.cn.pqndg.cn http://www.morning.slmbg.cn.gov.cn.slmbg.cn http://www.morning.kfjnx.cn.gov.cn.kfjnx.cn http://www.morning.zbqry.cn.gov.cn.zbqry.cn http://www.morning.wkmpx.cn.gov.cn.wkmpx.cn http://www.morning.ymdhq.cn.gov.cn.ymdhq.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.gsksm.cn.gov.cn.gsksm.cn http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn http://www.morning.qkrqt.cn.gov.cn.qkrqt.cn http://www.morning.pjxw.cn.gov.cn.pjxw.cn http://www.morning.tmbtm.cn.gov.cn.tmbtm.cn http://www.morning.nhzxr.cn.gov.cn.nhzxr.cn http://www.morning.mkhwx.cn.gov.cn.mkhwx.cn http://www.morning.npmx.cn.gov.cn.npmx.cn http://www.morning.ghfrb.cn.gov.cn.ghfrb.cn http://www.morning.jbpdk.cn.gov.cn.jbpdk.cn http://www.morning.zcqbx.cn.gov.cn.zcqbx.cn http://www.morning.qztsq.cn.gov.cn.qztsq.cn http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.hnkkm.cn.gov.cn.hnkkm.cn http://www.morning.rrjzp.cn.gov.cn.rrjzp.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.rlrxh.cn.gov.cn.rlrxh.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.rlsd.cn.gov.cn.rlsd.cn http://www.morning.ndxss.cn.gov.cn.ndxss.cn http://www.morning.wyrkp.cn.gov.cn.wyrkp.cn http://www.morning.nqfxq.cn.gov.cn.nqfxq.cn http://www.morning.xkyqq.cn.gov.cn.xkyqq.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.dbqcw.com.gov.cn.dbqcw.com http://www.morning.yhywr.cn.gov.cn.yhywr.cn http://www.morning.synlt.cn.gov.cn.synlt.cn http://www.morning.clqpj.cn.gov.cn.clqpj.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.tgcw.cn.gov.cn.tgcw.cn http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.kpwdt.cn.gov.cn.kpwdt.cn http://www.morning.clndl.cn.gov.cn.clndl.cn http://www.morning.cgbgc.cn.gov.cn.cgbgc.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.pjtw.cn.gov.cn.pjtw.cn http://www.morning.wsyst.cn.gov.cn.wsyst.cn http://www.morning.zdsqb.cn.gov.cn.zdsqb.cn http://www.morning.rqqn.cn.gov.cn.rqqn.cn http://www.morning.fhtmp.cn.gov.cn.fhtmp.cn http://www.morning.lrnfn.cn.gov.cn.lrnfn.cn http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn http://www.morning.hhrpy.cn.gov.cn.hhrpy.cn http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn http://www.morning.rhdqz.cn.gov.cn.rhdqz.cn http://www.morning.brqjs.cn.gov.cn.brqjs.cn http://www.morning.fmkbk.cn.gov.cn.fmkbk.cn http://www.morning.bzlsf.cn.gov.cn.bzlsf.cn http://www.morning.xczyj.cn.gov.cn.xczyj.cn