Boost.Lambda で、switch case を行う

なにやら、boost/lambda/switch.hpp なるものがあったので試してみました。


[source]

#include <iostream>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/lambda/switch.hpp>
#include <boost/lambda/lambda.hpp>

int
main(){
    namespace lambda = boost::lambda;

    boost::for_each(boost::irange(0, 5),  (
        lambda::switch_statement(
            lambda::_1,
            lambda::case_statement<0>(std::cout << lambda::constant("zero") ),
            lambda::case_statement<1>(std::cout << lambda::constant("one") ),
            lambda::default_statement(std::cout << lambda::constant("other:") << lambda::_1)
        ), 
        std::cout << lambda::constant("\n") )
    );

    auto f =
        lambda::switch_statement(
            lambda::_1%2 == 0,
            lambda::case_statement<true> (std::cout << lambda::_1 << ":偶数\n" ),
            lambda::case_statement<false>(std::cout << lambda::_1 << ":奇数\n")
        );
    
    boost::for_each(boost::irange(0, 5), f);
    std::cout << "\n";

    return 0;
}

[出力]

zero
one
other:2
other:3
other:4
0:偶数
1:奇数
2:偶数
3:奇数
4:偶数


使い方なんかは、ソースを見れもらえれば分かるかと。
case の部分を lambda::case_statement の template 引数として渡しています。
template に渡せるのは、int 型のみっぽいです。
mpl::string が使えれば面白いかと思いましたが、ちょっと無理そうですねー。


[boost]
ver 1.45.0
[参照]
http://www.boost.org/doc/libs/1_46_0/doc/html/lambda/le_in_details.html#lambda.switch_statement