ついでに

寝る前に書いたFizzBuzzメタプログラミングコードを書いたので掲載しておこうかなぁと思います*1。%演算子を使っている点で私自身は不満ですが、即席で作ったにしてはそれなりにできてるほうじゃないでしょうか(何が)。後、FizzBuzzはstring接続でどうにかしたいのだけれどどうにもならない。いや、これはこれで効率的な気がするけれど....。

#include <iostream>

template< int num, bool fizz = false, bool buzz = false >
struct fizz_buzz
{
        fizz_buzz()
        {
                fizz_buzz< num - 1, ( ( num - 1 ) % 3 == 0 ), \
 ( ( num - 1 ) % 5 == 0 ) >();  
                std::cout << num << std::endl;
        }
};
 
template< bool fizz, bool buzz >
struct fizz_buzz< 1, fizz, buzz >
{
        fizz_buzz()
        {
                std::cout << "1\n";
        }
};
 
template< int num >
struct fizz_buzz< num, true, false >
{
        fizz_buzz()
        {
                fizz_buzz< num - 1, false, ( ( num - 1 ) % 5 == 0 ) >();  
                std::cout << "fizz" << std::endl;
 
        }
 
};
 
template< int num >
struct fizz_buzz< num, false, true >
{
        fizz_buzz()
        {
                fizz_buzz< num - 1, ( ( num - 1 ) % 3 == 0 ), false >();  
                std::cout << "buzz" << std::endl;
        }
};
 
template< int num >
struct fizz_buzz< num, true, true >
{
        fizz_buzz()
        {
                fizz_buzz< num - 1, false, false >();  
                std::cout << "fizzbuzz" << std::endl;
        }
};
 
int main()
{
        fizz_buzz< 400, false, false >();
        return 0;
}

*1:寝る時に羊を数えるようにふらふらと書いた