编译时展开循环
Unroll loop at compile time
我想将一堆行写入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
如果你的循环阈值在编译时是已知的,这非常简单:
template<class CB, size_t... Is> void unroll_loop_impl(std::index_sequence<Is...> {}, CB&& cb) {
void* aux[] = {(cb(Is), nullptr)...};
(void)aux;
}
template<size_t N, class CB> void unroll_loop(CB&& cb) {
using index_seqeunce_t = std::make_index_sequence<N>;
unroll_loop_impl(std::move(cb), index_sequence_t{});
}
相关文章:
- 用于循环编译的 constexpr
- 如何编译使用循环引用的代码?
- 递归应用 C++20 范围适配器会导致编译时无限循环
- constexpr 函数中的 for 循环无法使用 MSVC 19.23 进行编译
- 编译时展开循环
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 两次相同的 for 循环:一个编译,另一个不编译
- C++ 通用编译时循环
- 循环遍历地图时编译错误
- 编译时循环优化
- C++ 上的循环依赖和继承编译错误
- G++ 编译和 while 循环
- 如何将编译的扩展为函数或循环
- 两个类中的循环依赖关系 - 代码无法编译
- 有没有一种方法可以关闭C++和Rust编译中的循环优化
- 在 for 循环的增量部分中分配指针时出现奇怪的编译错误C++
- QGuiApplication在使用Qt 5.3或Qt 5.4(但不使用Qt 5.2)编译时,当手机被锁定时停止事件循环
- gcc和clang都无法编译循环程序
- VS2013上同时使用基于范围的for循环和do while循环时出现编译错误
- 如果在Xeon Phi上编译时循环计数未知,则性能会降低