Boost.PP で、FizzBuzz をやってみた

とりあえず、何も考えずにベタ書き。

[ソース]

#include <boost/preprocessor/if.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/logical/and.hpp>
#include <boost/preprocessor/arithmetic/mod.hpp>
#include <boost/preprocessor/enum_shifted.hpp>

#define FIZZ_BUZZ(z, n, d)                                \
    BOOST_PP_IF(                                          \
        BOOST_PP_AND(                                     \
            BOOST_PP_EQUAL(BOOST_PP_MOD(n, 3), 0),        \
            BOOST_PP_EQUAL(BOOST_PP_MOD(n, 5), 0)         \
        ),                                                \
        BOOST_PP_CAT(fizz, buzz),                         \
        BOOST_PP_IF(                                      \
            BOOST_PP_EQUAL( BOOST_PP_MOD(n,3), 0),        \
            fizz,                                         \
            BOOST_PP_IF(                                  \
                BOOST_PP_EQUAL( BOOST_PP_MOD(n,5), 0),    \
                buzz,                                     \
                n                                         \
            )                                             \
        )                                                 \
    )

BOOST_PP_ENUM_SHIFTED(50, FIZZ_BUZZ, ~)

#undef FIZZ_BUZZ

[出力]

 1 , 2 , fizz , 4 , buzz , fizz , 7 , 8 , fizz , buzz , 11 , fizz , 13 , 14 , fizzbuzz , 16 , 17 , fizz , 19 , buzz , fizz , 22 , 23 , fizz , buzz , 26 , fizz , 28 , 29 , fizzbuzz , 31 , 32 , fizz , 34 , buzz , fizz , 37 , 38 , fizz , buzz , 41 , fizz , 43 , 44 , fizzbuzz , 46 , 47 , fizz , 49

Boost.PP 楽しいなー(白目。