c-编译时展开循环

我想以i = 0,1,…,n的形式将大量的行写入foo(i)形式的C文件中,有没有办法在编译时做到这一点?

我想这样做,因为我有一个模板化的类:

template <int X> class MyClass{ ... }

我想用类似这样的东西来测试它的许多不同的“ X”值:

for (int i = 0; i < n; i++) {
    MyClass<i> bar;
    bar.method()
 }

这不起作用,因为它希望在编译时确定作为模板值传递的值.

我可以写出整个事情:

MyClass<0> bar0; bar0.method();
MyClass<1> bar1; bar1.method();

我可以定义一个定义来加快它的速度,例如:

#define myMacro(x) MyClass<x> bar_x; bar_x.method();

但是我仍然必须到处都写myMacro,并且我想太频繁地更改范围,以使其变得明智.如果我可以编写for循环的某种宏版本,则可以节省很多时间.

更新:我实际上需要将变量传递给我的方法,因此我对@Pascal给出的可接受答案做了些微更改

template<int X> class MyClass { public: void foo(int Y) { std::cout << X Y<< std::endl; } };
template<int X> inline void MyTest(int Y) { MyTest<X - 1>(Y); MyClass<X-1> bar; bar.foo(Y); }
template<> inline void MyTest<1>(int Y) { MyClass<0> bar; bar.foo(Y); }

解决方法:

较接近“宏方式”的解决方案可以是模板递归:

template<int X> class MyClass { public: void foo() { std::cout << X << std::endl; } };
template<int X> inline void MyTest() { MyTest<X - 1>(); MyClass<X-1> bar; bar.foo(); }
template<> inline void MyTest<1>() { MyClass<0> bar; bar.foo(); }
int main()
{
    MyTest<5>();
    return 0;
}

这个例子的输出是:

0
1
2
3
4
上一篇:c-使用boost进行编译以使用任何可用的boost版本?


下一篇:在CentOS 5上编译Python 2.4.3时,如何显式禁用_tkinter.c的编译?