テンプレートで再帰

Boost C++ Libraryの勉強をしていて今日覚えたこと。
テンプレートの特殊化とtypedefを使って型を変数、クラスを関数のように使っちゃおうというのがテンプレートメタプログラミングの考え方。
テンプレートメタプログラミングとはちょっと違う気もするんだけど、再帰を使って静的にN!を計算するものを作ってみた

// N! = N*(N-1)!
template <unsigned long N>
struct static_factorial
{
  BOOST_STATIC_CONSTANT(unsigned long, value
    = N * static_factorial<N-1>::value);
};

// 0! = 1
template <>
struct static_factorial<0UL>
{
  BOOST_STATIC_CONSTANT(unsigned long, value = 1);
};

うーん、これは面白い。
例えば

std::cout << static_factorial<10UL>::value << std::endl;

とすると 3628800 と出力されます。

この方法を使ったら再帰構造を持つクラスの実装とかが簡単にできそうな気がする。
N次元配列を簡単に実装できないだろうか…とりあえず遅いので今日は寝ますzz

Boost C++ Library プログラミング

Boost C++ Library プログラミング