在编译时展开循环

时间:2017-08-18 14:00:51

标签: c++ compilation variadic-macros

我想在foo(i)的{​​{1}}格式的C ++文件中写入一行代码,有没有办法在编译时执行此操作?

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

i = 0,1, ... , n

我想测试它的许多不同的值" X"有类似的东西:

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

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

我可以写出整件事:

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(); ,而且我想要经常更改范围以使其变得合情合理。如果我可以编写for循环的某种宏版本,那么可以节省很多时间。

更新:我实际上需要将变量传递给我的方法,所以我对@Pascal给出的接受答案稍作修改

myMacro

2 个答案:

答案 0 :(得分:2)

更接近&#34;宏观方式的解决方案&#34;可以是模板递归:

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

答案 1 :(得分:0)

如果你的循环阈值在编译时已知,这很简单:

DisplaySettingsChanged