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