c++ - 在编译时展开循环

标签 c++ compilation variadic-macros

我想将大量行写入 foo(i) 形式的 C++ 文件,其中 i = 0,1, ... , n 是有没有办法在编译时执行此操作?

我想这样做是因为我有一个模板类:

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++ - 在编译时展开循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45758545/

相关文章:

c++ - C++ 中的类型检查

c++ - 在 Linux 中使用外部 C++ 脚本解密并挂载 eCryptFS 加密目录

javascript - 从字符串动态注册 Vue.js 组件

Android - NDK - 需要 1+ args 的 Variadic 宏

C++ 预处理器 __VA_ARGS__ 参数数量

C++ - 将结果输出到 xlsx(电子表格)而不是 CSV

c++ - toupper属于哪个命名空间

windows - 在预构建事件中设置环境变量并在编译步骤中使用

c++ - ';' token 之前的错误 : expected ',' , ')' 或 '='

c++ - 为什么可变参数宏如此令人不快?