Hatena::Groupborn1981

earth2001yの1981s日記 このページをアンテナに追加 RSSフィード

[[メインのはてな日記はこっち]]
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 12 |

Jan 23, 2008. Wed

C++テンプレートでFizzBuzz

| 02:19 | C++テンプレートでFizzBuzz - earth2001yの1981s日記 を含むブックマーク はてなブックマーク - C++テンプレートでFizzBuzz - earth2001yの1981s日記 C++テンプレートでFizzBuzz - earth2001yの1981s日記 のブックマークコメント

先日の野望会のLTで話したC++テンプレートのネタ。完成品コードだけ貼っておく。(まとめ・解説は、C++テンプレートでFizzBuzz - おびなたのはてな日記

#include <iostream>
using namespace std;

template <int n>
  struct N {
    typedef N<n> ev;
    static const int vl = n;
    static void print() { cout << vl << endl; }
  };

template<class N1>
  struct INC { typedef N<N1::ev::vl + 1> ev; };
template<class N1,class N2>
  struct MOD { typedef N<N1::ev::vl % N2::ev::vl> ev; };

template<class T1,class T2> struct _EQ      { typedef N<0> ev; };
template<class T>           struct _EQ<T,T> { typedef N<1> ev; };
template<class N1,class N2> struct EQ {
  typedef typename _EQ<typename N1::ev, typename N2::ev>::ev ev;
};

template<class _T> struct _NOT        { typedef N<0> ev; };
template<>         struct _NOT<N<0> > { typedef N<1> ev; };
template<class T>  struct NOT {
  typedef typename _NOT<typename T::ev>::ev ev;
};

template<class _C, class _T1,class _T2>
  struct _IF { typedef typename _T1::ev ev; };
template<class _T1,class _T2>
  struct _IF<N<0>,_T1,_T2> { typedef typename _T2::ev ev; };
template<class C,class T1,class T2>
  struct IF { typedef typename _IF<typename C::ev,T1,T2>::ev ev; };

struct Fizz {
  typedef Fizz ev;
  static void print() { cout << "Fizz" << endl; }
};
struct Buzz {
  typedef Buzz ev;
  static void print() { cout << "Buzz" << endl; }
};
struct FizzBuzz {
  typedef FizzBuzz ev;
  static void print() { cout << "FizzBuzz" << endl; }
};

template<class T>
  struct ConvFizzBuzz {
    typedef typename
      IF<NOT<MOD<T,N<15> > >, FizzBuzz,
      IF<NOT<MOD<T,N< 5> > >, Buzz,
      IF<NOT<MOD<T,N< 3> > >, Fizz,
                              T
    > > >::ev ev;
    static void print() { ev::print(); }
  };

struct FizzBuzzTerminal {
  typedef FizzBuzzTerminal ev;
  static void print() { }
};

template<class T1, class T2>
  struct FizzBuzzList {
    typedef FizzBuzzList<INC<T1>, T2> ev;
    typedef typename ConvFizzBuzz<T1>::ev vl;
    typedef typename
      IF<EQ<T1,T2>, FizzBuzzTerminal, FizzBuzzList<T1,T2> >::ev next;
    static void print() {
      vl::print();
      next::print();
    }
  };

int main()
{
  FizzBuzzList<N<0>, N<20> >::print();  // N<0>, N<20>は適当に置き換えておk
}

pinkmacpinkmac2008/02/04 02:00おおお。ぜひ世界のナベアツ問題にも挑んでくださいwwww
→http://www.yabooo.org/archives/60

earth2001yearth2001y2008/02/04 21:55「"3"が含まれる」ってのが難しい><

ototoiototoi2008/02/04 23:53これってC++というよりhaskell書いてるみたいだよね。→http://born1981.g.hatena.ne.jp/ototoi/20080205

トラックバック - http://born1981.g.hatena.ne.jp/earth2001y/20080123