現在の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; }
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; }