Fizz Buzz問題を解いてみた

どこかでFizzBuzzが書けないやつはプログラマではないという記事を見たので、あわてて書いてみた。

#include <iostream>

template <int N, bool f15, bool f5, bool f3>
struct Message {
  static const int value = N;
};

template<int N, bool f5, bool f3>
struct Message<N, true, f5, f3> {
  static const char* value;
};
template <int N, bool f5, bool f3>
const char* Message<N, true, f5, f3>::value = "Fizz Buzz";

template<int N, bool f3>
struct Message<N, false, true, f3> {
  static const char* value;
};
template <int N, bool f3>
const char* Message<N, false, true, f3>::value = "Buzz";

template<int N>
struct Message<N, false, false, true> {
  static const char* value;
};
template <int N>
const char* Message<N, false, false, true>::value = "Fizz";


template<int N, int M>
struct is_mod {
  static const bool value = N%M==0;
};

template<int N>
struct FizzBuzz {
  static void print() {
    std::cout << 
      Message<N, 
             is_mod<N, 15>::value,
             is_mod<N,  5>::value, 
             is_mod<N,  3>::value>::value << std::endl;
  }
};


template<int N>
struct FizzBuzzList {
  static void print() {
    FizzBuzzList<N-1>::print();
    FizzBuzz<N>::print();
  }
};

template<>
struct FizzBuzzList<0> {
  static void print() {
  }
};

int main() {

  FizzBuzzList<35>::print();
  return 0;
}

もう少しきれいに書ける気がするけど、単純に書くとこんなもん?
結構こりだすと幾らでも突き詰めることが出来る気がするので、奥が深いなぁと感じた。
ところで今回のようにテンプレートを使用した場合、剰余記号(%)を使うのはズルなんですかね?
まあ、暇があったら使わないバージョンも書いてみよう。。。