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