c++元编程(编译期代码)
元编程
编译期执行的变成,类似宏定义和模板,再编译期需要展开实现
宏定义
#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++元编程(编译期代码)相关推荐
- 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...
- 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )
文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...
- 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )
文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...
- 【Groovy】编译时元编程 ( 编译 ASTTransformation | 打包 ASTTransformation 字节码文件 | 编译 Groovy 类同进行编译时处理 )
文章目录 一.编译 ASTTransformation 二.打包 ASTTransformation 字节码文件 三.编译 Groovy 类同进行编译时处理 一.编译 ASTTransformatio ...
- 【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )
文章目录 一.编译时处理 ASTTransformation 接口实现 二.配置 ASTTransformation 一.编译时处理 ASTTransformation 接口实现 声明 ASTTran ...
- 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)
文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...
- 【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )
文章目录 一.ASTTransformation#visit 方法简介 二.org.codehaus.groovy.ast.ModuleNode 脚本节点 一.ASTTransformation#vi ...
- 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )
文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...
- C++ 模板元编程简介
文章目录 1.概述 2.模板元编程的作用 3.模板元编程的组成要素 4.模板元编程的控制逻辑 4.1 if 判断 4.2 循环展开 4.3 switch/case 分支 5.特性.策略与标签 6.小结 ...
最新文章
- [PA2014]Pakowanie
- java中 int 比较_java中Integer与int的种种比较你知道多少?
- redhat6.5手动配置网络
- String类以及String与基本数据类型/char[]/byte[]之间的转换
- pytorch图像数据增强N大技巧
- 学术词汇 | Ablation Test or Ablation Experiment
- 【kafka】Apache Kafka 0.11版本新功能简介
- 使用多线程完成Socket
- jwt token and shiro
- Windows下Vim设置
- java中String、StringBuffer和StringBuilder的区别(简单介绍)
- .net GridView绑定数据、编辑、更新、删除(弹出确认对话框)、取消、根据条件隐藏或显示按钮操作
- Windows7 下载android源码
- sql server插入语句
- c语言程序怎样输出一个图形,用c语言如何输出并显示一个序列图形
- MapReduce实现kmeans算法
- 定制合成:热激发延迟荧光材料PPZ-3TPT、PPZ-4TPT、PPZ-DPS或PXZ-DPS、DMAC-DPS
- [乐意黎原创] 手动挡驾驶技巧
- 普元 AppServer 部署时页面提示部署失败,后台报错:Unable to load class org.apache.cxf.ws.policy.AssertionBuilder
- C语言实现IP合法性判断