我想我理解如何在 C++ 中懒惰地评估模板,例如递归替换和扩展的最终简化。这通常会限制可用的递归深度。我想知道是否使用 C++11 中的新功能(例如可变参数模板或模板包)或使用一些 Boost 可以强制执行严格的模板评估。或者这在 C++ 中原则上是不可能的?
例如,考虑一个对所有整数值求和的模板0..n
:
template <int n>
struct sumAll { enum { value = n + sumAll<n-1>::value }; };
template <>
struct sumAll<0> { enum { value = 0 }; };
#include <iostream>
int main() { std::cout << sumAll<10000>::value << std::endl; }
这里sumAll<10>::value
将扩展为
sumAll<10>::value = 10 + sumAll<9>::value
= 10 + 9 + sumAll<8>::value
= 10 + 9 + 8 + sumAll<7>::value
= ...
= 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
并且只有在模板完全展开后才会执行最终的求和。如果最终展开变得太长(例如在具有许多项的复杂级数展开中),编译器最终将耗尽存储附加项的空间。
我的问题本质上是是否有一种方法可以更早地进行简化(如上面的求和)。