再帰テンプレート
本を読んでいたらテンプレートの特殊化について出てきたので練習がてら再帰テンプレートを使って
アッカーマン関数を作ってみた
#include <iostream> template<int m,int n> struct ack { enum{ ans = ack<m - 1,ack<m,n - 1>::ans>::ans }; }; template<int n> struct ack<0,n> { enum{ ans = n + 1 }; }; template<int m> struct ack<m,0> { enum{ ans = ack<m - 1,1>::ans }; }; template<> struct ack<0,0> { enum{ ans = 1 }; }; int main(void) { ack<3,1> obj31; std::cout << obj31.ans; return 0; }
実行結果:13
ちなみにack<4,1> = 65533とかを試すとネストが深すぎるようでコンパイラが落ちた(VC,gcc両方とも)
しかしユーザーが書いたコードによってはコンパイル時に無限ループになるっていうのはおもしろい