Boost.Phoenix で、FizzBuzz

いくつか手法はありますが、まぁ何も考えずにガリガリ書くとこんな感じです。

[ソース]

#include <boost/phoenix.hpp>
#include <iostream>
#include <boost/lexical_cast.hpp>

int
main(){
    namespace phx = boost::phoenix;
    using phx::arg_names::arg1;
    using phx::local_names::_i;

    phx::let(_i = phx::val(1) )[
        phx::for_(phx::nothing, _i < arg1, ++_i)[
            phx::if_(_i % 3 == 0 && _i % 5 == 0)[
                std::cout << phx::val("fizzbuzz") << " "
            ]
            .else_[
                phx::if_(_i % 3 == 0)[
                    std::cout << phx::val("fizz") << " "
                ]
                .else_[
                    phx::if_(_i % 5 == 0)[
                        std::cout << phx::val("buzz") << " "
                    ]
                    .else_[
                        std::cout << _i << " "
                    ]
                ]
            ]
        ]
    ](40);
    
    return 0;
}

[出力]

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 

こんな感じですね。
phx::for_ では、ローカル変数の定義が出来ないので、phx::let で、ローカル変数の定義を行っています。

[boost]

  • ver 1.47.0