・・・と思ったら他の方がいろいろ書いてくれてますね。

>>778
残るは順列と組合せだけ。記憶を頼りに書いてみます。

#include <iostream>

// 順列
template<int M, int N> struct P {
  enum{ value = M * P<M - 1, N - 1>::value };
};

template<int M> struct P<M, 0> {
  enum{ value = 1 };
};

// 組合せ
template<int M, int N> struct C {
  enum{ value = C<M - 1, N>::value + C<M - 1, N - 1>::value };
};

template<int M> struct C<M, 0> {
  enum{ value = 1 };
};

template<int M> struct C<M, M> {
  enum{ value = 1 };
};

int main() {
  std::cout << P<5, 3>::value << ", " << C<5, 3>::value << std::endl;
}