再帰テンプレート

本を読んでいたらテンプレートの特殊化について出てきたので練習がてら再帰テンプレートを使って
アッカーマン関数を作ってみた

#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両方とも)


しかしユーザーが書いたコードによってはコンパイル時に無限ループになるっていうのはおもしろい