プリプロセッサでFizzBuzz

ネタ元:http://d.hatena.ne.jp/bleis-tift/20090929/1254185496


#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/arithmetic/mod.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/preprocessor/logical/not.hpp>
#include <boost/preprocessor/repetition/enum_trailing.hpp>

#define FIZZBUZZ_OP(_, n, d) FIZZBUZZ_OP_I(BOOST_PP_INC(n))
#define FIZZBUZZ_OP_I(n) \
FIZZBUZZ_OP_II( \
BOOST_PP_CAT(FIZZBUZZ_OP_III(n, 3, FIZZ), \
FIZZBUZZ_OP_III(n, 5, BUZZ)), \
n)
#define FIZZBUZZ_OP_II(t, n) BOOST_PP_IIF(BOOST_PP_IS_EMPTY(t), n, t)
#define FIZZBUZZ_OP_III(m, n, t) \
BOOST_PP_EXPR_IIF(BOOST_PP_NOT(BOOST_PP_MOD(m, n)), t)

BOOST_PP_ENUM_TRAILING(100, FIZZBUZZ_OP, _)

プリプロセッサならこれぐらいは朝飯前なのね。実行は "cpp -E -P ソースファイル" とか、"cl.exe /EP ソースファイル" で、Boostへのパスは事前に通すか、-Ipathとか/I:pathとかで指定するのね。
で、これをcodepadで試すとtimeoutしてしまうので、cpp -E -Pで実行した結果を貼るのね:
, 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 , BUZZ , FIZZ , 52 , 53 , FIZZ , BUZZ , 56 , FIZZ , 58 , 59 , FIZZBUZZ , 61 , 62 , FIZZ , 64 , BUZZ , FIZZ , 67 , 68 , FIZZ , BUZZ , 71 , FIZZ , 73 , 74 , FIZZBUZZ , 76 , 77 , FIZZ , 79 , BUZZ , FIZZ , 82 , 83 , FIZZ , BUZZ , 86 , FIZZ , 88 , 89 , FIZZBUZZ , 91 , 92 , FIZZ , 94 , BUZZ , FIZZ , 97 , 98 , FIZZ , BUZZ
追記:Boost.PPを漁っていると、BOOST_PP_ENUM_SHIFTEDというのがあった。これをBOOST_PP_ENUM_TRAILINGの代わりに使えば:

#include <boost/preprocessor/arithmetic/mod.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/preprocessor/logical/not.hpp>
#include <boost/preprocessor/repetition/enum_shifted.hpp>

#define FIZZBUZZ_OP(z, n, d) \
FIZZBUZZ_OP_I( \
BOOST_PP_CAT(FIZZBUZZ_OP_II(n, 3, FIZZ), \
FIZZBUZZ_OP_II(n, 5, BUZZ)), \
n)
#define FIZZBUZZ_OP_I(t, n) BOOST_PP_IIF(BOOST_PP_IS_EMPTY(t), n, t)
#define FIZZBUZZ_OP_II(m, n, t) \
BOOST_PP_EXPR_IIF(BOOST_PP_NOT(BOOST_PP_MOD(m, n)), t)

BOOST_PP_ENUM_SHIFTED(101, FIZZBUZZ_OP, _)

と短く書けて、
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 , BUZZ , FIZZ , 52 , 53 , FIZZ , BUZZ , 56 , FIZZ , 58 , 59 , FIZZBUZZ , 61 , 62 , FIZZ , 64 , BUZZ , FIZZ , 67 , 68 , FIZZ , BUZZ , 71 , FIZZ , 73 , 74 , FIZZBUZZ , 76 , 77 , FIZZ , 79 , BUZZ , FIZZ , 82 , 83 , FIZZ , BUZZ , 86 , FIZZ , 88 , 89 , FIZZBUZZ , 91 , 92 , FIZZ , 94 , BUZZ , FIZZ , 97 , 98 , FIZZ , BUZZ
行頭のカンマがなくなってちょっと幸せ。