我假設cmdParseOption()
的第三個參數是const char *
。
在C++中的任何版本,
#include<string>
#include <map>
typedef void (*function)();
void func1() {}; // we want to call this function for "-doit1"
void func2() {}; // we want to call this function for "-doit2"
int main()
{
std::map<std::string, function> option_map;
option_map["-doit1"] = func1;
option_map["-doit2"] = func2;
// etc
for (std::map<std::string>::const_iterator i = option_map.begin(), end = option_map.end(); i != end; ++i)
{
if (cmdParseOption(&argc, &argv, i->first.c_str())
{
// we've found a match in the map. Call the corresponding function
(i->second)();
}
}
return 0;
}
如果你想30點或300的選擇,所有需要改變的是建立地圖 - 循環保持不變。
在C++ 11及更高版本,這可以簡化一點
#include<string>
#include <map>
typedef void (*function)();
void func1() {}; // we want to call this function for "-doit1"
void func2() {}; // we want to call this function for "-doit2"
int main()
{
std::map<std::string, function> option_map{
{"-doit1", func1},
{"-doit2", func2}
};
for (auto &i : option_map)
{
if (cmdParseOption(&argc, &argv, i.first.c_str())
{
(i.second)();
}
}
return 0;
}
如果你想其他類型的回調,也有豐富的選擇 - 無論是在功能類型方面,並在設施標準庫。
如果你想引入另一個檢查(如呼叫ecmdParseOption()
而不是cmdParseOption()
在你的第二個else if
)只需設置第二圖,填充它,並根據需要遍歷它。
這正是我所期待的。有一種感覺,矢量/地圖可能解決我的問題,但沒有很多與他們的經驗。謝謝! – BoredMatt