Templates 关于编译时代码生成的问题

Templates 关于编译时代码生成的问题,templates,macros,Templates,Macros,我有一个类似的要求 void doSomeThing(int x) { ..... } void fun() { #ifdef XXXX_1_YYYY doSomeThing(XXXX_1_YYYY); #endif //XXXX_1_YYYY #ifdef XXXX_2_YYYY doSomeThing(XXXX_2_YYYY); #endif //XXXX_2_YYYY #ifdef XXXX_3_YYYY doSomeThing(XXXX_3_YYYY); #endi

我有一个类似的要求

void doSomeThing(int x)
{
.....
}

void fun()
{

 #ifdef XXXX_1_YYYY
doSomeThing(XXXX_1_YYYY);
 #endif //XXXX_1_YYYY

 #ifdef XXXX_2_YYYY
doSomeThing(XXXX_2_YYYY);
 #endif //XXXX_2_YYYY

 #ifdef XXXX_3_YYYY
 doSomeThing(XXXX_3_YYYY);
 #endif //XXXX_3_YYYY

 #ifdef XXXX_4_YYYY
 doSomeThing(XXXX_4_YYYY);
 #endif //XXXX_4_YYYY

....
upto XXXX_20_YYYY

}
无论如何,我是否可以使用一些宏扩展技术或任何其他解决方案将此文件的类型减少到20个

宏定义可以是这样的

#define XXXX_1_YYYY 10
#define XXXX_2_YYYY 20
#define XXXX_3_YYYY 30
#define XXXX_4_YYYY 40
...
#define XXXX_20_YYYY 200
每个ifdef都不是相互排斥的。
代码在c++

中可能是一个微不足道的答案,但是如果它们都是互斥的,那么使用elif将为您节省大量的endifs


如果你不知道自己到底想做什么,就很难找到一个好的方法来避免这种情况。所有这些函数都在同一个文件中,每个函数都有一个if吗?

我看不出用标准C预处理器实现的方法

也许这个问题可以重述一遍。你能告诉我们更广泛的背景吗


请记住,不要滥用C预处理器,您始终可以使用其他工具生成代码,如m4、perl、bash等,或者Windows上的JScript、VBScript等。如果您的构建系统允许,也就是说。

如果有一个特殊值XXXX\u n\u yyy,比如指针值为NULL,int值为-1,等等,您可以使用该特殊值将该常量标记为未定义,而不是将其保留为未定义。然后您可以使用如下代码:

void fun()
{
    size_t i;
    static XYXX_type job_que[] = { XXXX_1_YYYY, XXXX_2_YYYY, .... };

    for (i=0; i!=ARRAY_SIZE(job_que); ++i)
    {
        if (job_que[i] != SPECIAL_VALUE) do_something(job_que[i]);
    }
}

根据给定的细节,很难想出更好的方法。

更多信息,请告诉我,你想做什么?这是Boost的“c”版本,是吗?@Will Dean:好吧,也许没有c verison,但你可以复制粘贴所有预处理器的东西。。。是同一个预处理器,对吗?其次,这个问题的原始标签只是“宏”“模板”我想说些什么,不知道为什么那个家伙会改变它。。。所以,是的,我很确定他使用的是c++实际上不,你不能在宏中伪造一个ifDEF。你不能让宏扩展到更多的预处理器指令。这是不可能的,除非你定义了所有的预处理器指令,并将未定义的指令设置为某个值,比如-1。我希望这是编译时,而不是运行时。在这种情况下,请参阅上面matt的评论。你所拥有的是你所能达到的最好的。使用C++,可以使用空函数重载doiSothTimeLoValk,并且定义未定义的重载以防止错误,可以在没有IF和数组的情况下执行相同的循环,但这是我能想到的最好的。