可变参数模板循环,非递归
Variadic template loop, non recursive
>我有一些函数,可以执行复杂的绘图。[伪代码]
template<typename fields...> // field names of Brush class
void someFunction(){
for(very large loop){
Brush brush = getBrush();
int x;
foreach(field : fields){ // <--- this somehow should be replaced
x = brush.*field;
brush.update(x);
}
}
}
[清单 1]
我称之为:
someFunction<&Brush::xPos1, &Brush::xPos2, &Brush::xPos3, &Brush::xPos4>()
我希望编译器生成这样的东西:
void someFunction(){
for(very large loop){
Brush brush = getBrush();
int x;
x = brush.xPos1;
brush.update(x);
x = brush.xPos2;
brush.update(x);
x = brush.xPos3;
brush.update(x);
x = brush.xPos4;
brush.update(x);
}
}
[清单 2]
我的意思是,我想摆脱那个foreach(字段:字段)。
我发现了这个可变参数模板循环实现,但它是递归的。对于性能共鸣,这甚至比foreach循环更糟糕
int a;
template <class T>
void print(const T msg)
{
a = msg;
}
// And this is the recursive case:
template <class A, class... B>
void print(A head, B... tail)
{
a = head;
print(head);
print(tail...);
}
[清单 3]
所以问题是....是否有可能获得[清单2]上的结果?如果是,那么如何?
我认为这样做没有真正的意义。编译器应将 for 循环和递归模板优化为同一代码。无论如何,这样的事情应该有效:
struct Brush {
int xPos1, xPos2, xPos3, xPos4;
void update(int) {}
};
typedef int Brush::* Field;
template<Field...fs>
void Foo()
{
Brush brush;
int a[] = { (brush.update( brush.*fs ),0)... };
}
int main()
{
Foo<&Brush::xPos1, &Brush::xPos2, &Brush::xPos3, &Brush::xPos4>();
}
相关文章:
- 为什么在递归中使用循环会产生意想不到的结果?
- 无穷大而循环时具有递归函数
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- C++ 模板使用递归实现循环
- C++ 使用递归而不是 for 循环
- 递归应用 C++20 范围适配器会导致编译时无限循环
- 为什么这个递归函数会创建一个无限循环?
- 如何使用循环编写此递归
- 计算递归和时的无限循环
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- C++ 循环链表的递归基本情况
- 循环访问多个模板参数的递归模板函数
- 在 C++ 中用递归替换循环的 N 级
- 如果找不到解决方案,我如何留下递归循环,而不会打印任何东西
- 如何在C++中将基本嵌套循环转换为递归循环
- 在递归循环中条件修改的引用内存
- 递增迭代器并在递归循环中传递参数
- 当在有限递归循环中操作大型数组时,我应该在哪一点从堆栈切换到堆?
- 递归循环(c#)