テンプレートが 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
最終的な合計は、テンプレートが完全に展開された後にのみ実行されます。最終的な展開が長くなりすぎると (たとえば、多くの項を含む複雑な級数展開の場合)、コンパイラは最終的に追加の項を格納するためのスペースを使い果たします。
私の質問は本質的に、単純化(上記の合計など)を以前に実行する方法があったかどうかでした。