MagicalOok!Misa

ゲームAI関連情報などを。

C++でテンプレート特殊化を使ってコンパイル時FizzBuzz

※ブログ移動のため、再掲載

コンパイルが終わらないコード

なんとなく原因は分かる…。

#include <iostream>

template<int i, bool j = i % 3, bool k = i % 5>
struct Hoge
{
};
template<int i>
struct Hoge<i, true, true>
{
    void operator()()const
    {
        std::cout << i << std::endl;
    }
};

template<int i>
struct Hoge<i, false, true>
{
    void operator()()const
    {
        std::cout << "Fizz" << std::endl;
    }
};

template<int i>
struct Hoge<i, true, false>
{
    void operator()()const
    {
        std::cout << "Buzz" << std::endl;
    }
};
template<int i>
struct Hoge<i, false, false>
{
    void operator()()const
    {
        std::cout << "FizzBuzz" << std::endl;
    }
};
template<int Head, int Tail>
struct FizzBuzz
{
    enum { Next = Head+1 };
    void operator()()const
    {
        Hoge<Head>()();
        if (Head < Tail)
        {   
            FizzBuzz<Next, Tail>()();
        }
    }
};


int main()
{
    FizzBuzz<1, 10>()();

    return 0;
}

コンパイルが終わるコード

#include <iostream>

template<int i, bool j = i % 3, bool k = i % 5>
struct Hoge
{
};
template<int i>
struct Hoge<i, true, true>
{
    void operator()()const
    {
        std::cout << i << std::endl;
    }
};

template<int i>
struct Hoge<i, false, true>
{
    void operator()()const
    {
        std::cout << "Fizz" << std::endl;
    }
};

template<int i>
struct Hoge<i, true, false>
{
    void operator()()const
    {
        std::cout << "Buzz" << std::endl;
    }
};
template<int i>
struct Hoge<i, false, false>
{
    void operator()()const
    {
        std::cout << "FizzBuzz" << std::endl;
    }
};
template<int Head, int Tail, bool IsLoop = true>
struct FizzBuzz;
template<int Head, int Tail>
struct FizzBuzz<Head, Tail, true>
{
    enum { Next = Head + 1 };
    void operator()()const
    {
        Hoge<Head>()();
        FizzBuzz<Next, Tail, (Next<Tail)>()();
    }
};
template<int Head, int Tail>
struct FizzBuzz<Head, Tail, false>
{
    void operator()()const
    {
        Hoge<Head>()();
    }
};


int main()
{
    FizzBuzz<1, 30>()();

    return 0;
}

なんとなく始めたら一時間経ってた…

コンパイル終わるコード、もう少し良いやり方あると思う…。

やさしいC++ 第4版 (「やさしい」シリーズ)

やさしいC++ 第4版 (「やさしい」シリーズ)

独習C++ 第4版

独習C++ 第4版

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)