stringのswitch(のようなもの)

matsutakegohan1の日記 - 関数をmapに


現在のC++ではswitchにstringを使用することはできない

void func1() { cout << "func1" << endl; }
void func2() { cout << "func2" << endl; }

int main()
{
    string str;
    switch (str) { // エラー!
        case "abc":
            func1();
            break;

        case "xyz":
            func2();
            break;

        default:
            cout << "not found" << endl;
            break;
    }
    return 0;
}


そこで、if文でだらだらと書くことになるのだが

void func1() { cout << "func1" << endl; }
void func2() { cout << "func2" << endl; }

int main()
{
    string str;

    if (str == "abc")
        func1();
    else if (str == "xyz")
        func2();
    else
        cout << "not found" << endl;

    return 0;
}


これはとても美しくないので、以下のようにする

void func1() { cout << "func1" << endl; }
void func2() { cout << "func2" << endl; }

int main()
{
    typedef map<string, void(*)()> funcs_type;

    funcs_type funcs;
    funcs.insert(make_pair("abc", func1));
    funcs.insert(make_pair("xyz", func2));

    string str;

    funcs_type::iterator it = funcs.find(str);
    if (it != funcs.end())
        it->second();
    else
        cout << "not found" << endl;

    return 0;
}

C++0xラムダ式使うとこんな感じ(たぶん)

int main()
{
    typedef map<string, void(*)()> funcs_type;

    funcs_type funcs;
    funcs.insert.make_pair("abc", <>()(cout << "func1" << endl;));
    funcs.insert.make_pair("xyz", <>()(cout << "func2" << endl;));

    string str;

    funcs_type::iterator it = funcs.find(str);
    if (it != funcs.end())
        it->second();
    else
        cout << "not found" << endl;

    return 0;
}