Heaven's Kitchen

○ 実は今年初日記

C++のテンプレートでFizzBuzzとかいうキーワードを見かけて、ついかっとなって実装してしまった。

#include <iostream>

enum FizzBuzz {Fizz = 0, Buzz};
const static char *fizzbuzz[] = {"Fizz", "Buzz"};

template<bool T, FizzBuzz I>
struct Print {
    Print () { std::cout << fizzbuzz[I]; }
};

template<FizzBuzz I>
struct Print<false, I> { };

template<bool T, int N>
struct Terminate {
    Terminate () { std::cout << std::endl; }
};

template<int N>
struct Terminate<false, N> {
    Terminate () { std::cout << N << std::endl; }
};

template<int N, int M>
struct RunFizzBuzz {
    RunFizzBuzz () {
	const static bool fizz = N % 3 == 0, buzz = N % 5 == 0;
	Print<fizz, Fizz>(); 
	Print<buzz, Buzz>();
	Terminate<fizz || buzz, N>();
	RunFizzBuzz<N+1, M>();
    }
};

template<int N>
struct RunFizzBuzz<N, N> { };

int main()
{
    RunFizzBuzz<1, 101>();
    return 0;
}

うーん。いろいろ書き方があるなぁ。

といろいろ悩んだけどこの辺にしとこう。

修論書かないと…。

Valid XHTML 1.0! Valid CSS!