元编程

编译期执行的变成,类似宏定义和模板,再编译期需要展开实现

宏定义

#define ARG_COUNTX(…) A1X(VA_ARGS)
#define A3X(x) x //使宏定义在同一级展开
#define A1X(…) A3X(A4X(VA_ARGS, 3, 2, 1, 0))
#define A4X(1, 2, 3, count, …) count

A4X最大3个元素计数的宏定义

typedef struct{int a;int b;int c;}A;
#define PREPARE_MACRO(x)     x  //必须要加,否则__VA_ARGS__展开找不到对应项
#define FIELD_RECORD_INIT() std::vector<size_t> m_FieldOffset;
#define OFFSET(TYPE,MEMBER)  ((size_t)(&(((TYPE*)0)->MEMBER)))
#define POINT_OFFSET_1(TYPE,MEMBER,...) m_FieldOffset.emplace_back(OFFSET(TYPE,MEMBER));
#define POINT_OFFSET_2(TYPE,MEMBER,...) POINT_OFFSET_1(TYPE,MEMBER) PREPARE_MACRO(POINT_OFFSET_1(TYPE,__VA_ARGS__))
#define POINT_OFFSET_3(TYPE,MEMBER,...) POINT_OFFSET_1(TYPE,MEMBER) PREPARE_MACRO(POINT_OFFSET_2(TYPE,__VA_ARGS__))
#define REGISTER_OFFSET(TYPE,...) FIELD_RECORD_INIT() PREPARE_MACRO(POINT_OFFSET_3(TYPE,__VA_ARGS__))REGISTER_OFFSET(A,a,b,c)//遍历A的成员地址
  • for循环

宏定义循环可以通过,类似上面的宏递归展开方式实现

模板元编程

template <typename R, typename... T>    //R返回值,T参数列表
class dllfunctor_stdcall {public:dllfunctor_stdcall(string dll, string function){_f = (R(__stdcall *)(T...))DLLMap::getInstance().getProcAddress(dll, function.c_str());}R operator()(T... args) { return _f(args...); }private:R(__stdcall *_f)(T...);
};

模板T,可以对应多参数函数,可以强转函数类型


template <typename T>
void fun(const T& t){cout << t << '\n';
}template <typename T, typename ... Args>
void fun(const T& t, Args ... args){cout << t << ',';fun(args...);//递归解决(函数名相同,参数不同),利用模板推导机制,每次取出第一个,缩短参数包的大小。
}

参数展开,args…或者{args,…}

  • for循环
template <int I, int Max, typename Func>
struct ForLoop {static void run(Func func) {func(I);ForLoop<I + 1, Max, Func>::run(func); // 递归调用}
};
template <int Max, typename Func>
struct ForLoop<Max, Max, Func> {static void run(Func func) {}
};
ForLoop<0, 10, [](int i)>::run([](int i){std::cout << i << std::endl;});
  • if条件判断

if constexpr,常量表达式

c++元编程(编译期代码)相关推荐

  1. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...

  2. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...

  3. 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

    文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...

  4. 【Groovy】编译时元编程 ( 编译 ASTTransformation | 打包 ASTTransformation 字节码文件 | 编译 Groovy 类同进行编译时处理 )

    文章目录 一.编译 ASTTransformation 二.打包 ASTTransformation 字节码文件 三.编译 Groovy 类同进行编译时处理 一.编译 ASTTransformatio ...

  5. 【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )

    文章目录 一.编译时处理 ASTTransformation 接口实现 二.配置 ASTTransformation 一.编译时处理 ASTTransformation 接口实现 声明 ASTTran ...

  6. 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

    文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...

  7. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

    文章目录 一.ASTTransformation#visit 方法简介 二.org.codehaus.groovy.ast.ModuleNode 脚本节点 一.ASTTransformation#vi ...

  8. 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )

    文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...

  9. C++ 模板元编程简介

    文章目录 1.概述 2.模板元编程的作用 3.模板元编程的组成要素 4.模板元编程的控制逻辑 4.1 if 判断 4.2 循环展开 4.3 switch/case 分支 5.特性.策略与标签 6.小结 ...

最新文章

  1. [PA2014]Pakowanie
  2. java中 int 比较_java中Integer与int的种种比较你知道多少?
  3. redhat6.5手动配置网络
  4. String类以及String与基本数据类型/char[]/byte[]之间的转换
  5. pytorch图像数据增强N大技巧
  6. 学术词汇 | Ablation Test or Ablation Experiment
  7. 【kafka】Apache Kafka 0.11版本新功能简介
  8. 使用多线程完成Socket
  9. jwt token and shiro
  10. Windows下Vim设置
  11. java中String、StringBuffer和StringBuilder的区别(简单介绍)
  12. .net GridView绑定数据、编辑、更新、删除(弹出确认对话框)、取消、根据条件隐藏或显示按钮操作
  13. Windows7 下载android源码
  14. sql server插入语句
  15. c语言程序怎样输出一个图形,用c语言如何输出并显示一个序列图形
  16. MapReduce实现kmeans算法
  17. 定制合成:热激发延迟荧光材料PPZ-3TPT、PPZ-4TPT、PPZ-DPS或PXZ-DPS、DMAC-DPS
  18. [乐意黎原创] 手动挡驾驶技巧
  19. 普元 AppServer 部署时页面提示部署失败,后台报错:Unable to load class org.apache.cxf.ws.policy.AssertionBuilder
  20. C语言实现IP合法性判断

热门文章

  1. 用ScanFont打造你自己的字体
  2. 下列html中那个可以产生复选框,下列的HTML中( )可以产生复选框
  3. 网络安全应急响应服务方案怎么写?包含哪些阶段?一文带你了解!
  4. Vue项目接手的问题
  5. 内网渗透-SSH隧道
  6. 什么是微服务 微服务的优点和缺点
  7. Python小游戏——坦克飞机大战(附源码)
  8. 名画276 王翚《画卷五幅》
  9. visual studio比较文件差异(diff操作)
  10. Ubuntu常用C语言IDE,ubuntu下两个容易掌握的c/c++ IDE 环境介绍