switch case に string を渡したい
何か電波を受信したのでやってみました。
#include <iostream> #include <string> #include <boost/typeof/typeof.hpp> #define switch_(value) \ if( bool __flag__ = true ) \ for( BOOST_AUTO(__value__, value) ; __flag__ ; __flag__ = false ) #define case_(__case__) \ if( (!(__flag__ = !(__value__ == __case__) && __flag__)) ) #define break_ \ break #define default_ \ if(true) void switch_string(const std::string& str){ switch_(str){ case_("case1"){ std::cout << "case1" << std::endl; break_; } case_("case2"){ std::cout << "case2" << std::endl; break_; } case_("case3"); case_("case4"){ std::cout << "case3 or case4" << std::endl; break_; } default_{ std::cout << "default" << std::endl;; } } } void check(int value){ switch_(value){ case_(0); case_(2); case_(4); case_(6); case_(8){ std::cout << "even" << std::endl; break_; } case_(1); case_(3); case_(5); case_(7); case_(9){ std::cout << "odd" << std::endl; break_; } } } int main(){ for( int i = 0 ; i < 10 ; i++ ){ std::cout << i << ":"; check(i); } switch_string("case1"); switch_string("case2"); switch_string("case3"); switch_string("case4"); switch_string("nothing"); return 0; }
[出力]
0:even 1:odd 2:even 3:odd 4:even 5:odd 6:even 7:odd 8:even 9:odd case1 case2 case3 or case4 case3 or case4 default
oh......こ れ は ひ ど い。
どうせマクロを使うならもうちょっとスマートに出来なかったのか。
まぁやっていることは、単に if 文に展開しなおしているだけです。
__flag__ の辺りがキモさまっくす。
寝て起きれば、何をやっているのか分からなくなる自信がある。
__flag__ が false か、値が等しければ、処理を行う。
1回でも値が等しくなれば、__flag__ が false になるとかそんな感じ?
うーん、もうちょっと頭のいい方法はないものか。
ってか、普通に switch case に定数以外も渡したいよね。
[追記]
ハッシュを使用すれば、このような感じになるみたいです。
にゃるほどなー。
switch case で文字列を使う - 危ないRiSKのブログ
constexprなCRCを実装する - iorateの日記
[参照]
http://d.hatena.ne.jp/faith_and_brave/20071026/
http://ameblo.jp/nana-2007-july/entry-10037531052.html