2016-12-23 107 views
2

我想清理一段代碼,它將解析命令行提示符以運行特定功能。這個工具的最初意圖是成爲調用多個較低級別工具來完成各種任務的最高級別界面。問題是當工具開始擁有越來越多的功能時,我最終得到了一大塊參數解析。什麼是整合大量參數處理的乾淨方式?

if (cmdParseOption(&argc, &argv, "-doit0")) 
{ 
    flag = 0; 
} 
else if (cmdParseOption(&argc, &argv, "-doit1")) 
{ 
    flag = 1; 
} 
else if (ecmdParseOption(&argc, &argv, "-doit2")) 
{ 
    flag = 2; 
    var = 1; 
} 

這正好爲約30不同的命令,它看起來可怕的,我傾向於只是不喜歡別人大/ if塊中的代碼。有沒有更清晰的方式來完成大量的命令解析?考慮到開關/外殼聲明,但想知道是否有人知道更好的方法。大多數情況下只是設置一些變量,這些變量稍後會在一般功能中處理。

回答

1

我假設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)只需設置第二圖,填充它,並根據需要遍歷它。

+0

這正是我所期待的。有一種感覺,矢量/地圖可能解決我的問題,但沒有很多與他們的經驗。謝謝! – BoredMatt

相關問題