[心得]macro metaprogramming

楼主: loveflames (咕啾咕啾魔法阵)   2016-04-20 17:42:17
很久以前曾写过一个在预处理期算总和的小程式,请见8095
那时才刚懂得一些metaprogramming的皮毛(不过现在懂的招也不多就是)
后来有很长一段时间没继续碰,直到boost.preprocessor,又重新钻进来这个领域
因为boost不是标准库,于是想试试能否以标准方式,做出一个最简单的code生成器
用macro做metaprogramming,下面这个应该都是大家遇到的第一个难题,也是最难解决的
#define x 1
#define x x+1//x不会展开成1+1
如果只是要用来展开特定的次数,编译器有提供自己定义的macro
__COUNTER__:从0开始,每出现一次就加1,visual studio与gcc支援
__INCLUDE_LEVEL__:目前的include深度,仅gcc支援
不过这两个macro仍然不是标准所提供,若不希望使用
此时就要动用8095以bit来处理的方式
范例如下
#ifndef zzz //一开始会先展开这里一次
#define C 5 //注1以下的部分展开5次
#include <cstdio>
#include "loop"//里面包的是8095的bit处理部分,有关token的初始定义
#define zzz x0+x1*2+x2*4+x3*8+x4*16+x5*32+x6*64+x7*128
template<int n> void f(){
printf("%d\n",n);
}
#endif
#if zzz>=C //最后才展开这里
int main(){
f<0>();
f<1>();
f<2>();
f<3>();
f<4>();
f<5>();
f<6>();
}
#else //注1,反复展开的部分
#if zzz ==2
#elif zzz ==3
#else //不产生f<2>跟f<3>的特化
template<> void f<zzz>(){
printf("ss:%d\n",zzz);
}
#endif
#include "loop"//里面包的是8095的bit处理部分,负责让zzz递增
#include __FILE__
#endif
作者: CoNsTaR ((const *))   2016-04-21 01:44:00
推 marco metaprogramming
楼主: loveflames (咕啾咕啾魔法阵)   2016-04-21 02:08:00
可能还有其他解法,延迟展开macro听说能解决递回自己的问题但是要加一个中间层,还没搞懂原理

Links booklink

Contact Us: admin [ a t ] ucptt.com