2016-12-23 61 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

相关问题