2013-07-31 79 views
3

我想处理(注意,不能以任何方式使用)未知选项。使用boost命令行解析器处理未知命令

所以有这样的:

http://www.boost.org/doc/libs/1_54_0/doc/html/program_options/howto.html#idp123440592

,可用于收集和使用任何未知的选项,因此我可以这样做:

po::variables_map vm; 
po::parsed_options parsed = po::command_line_parser(ac,av).options(desc).allow_unregistered().run(); 

{ 
    vector<string> to_pass_further = collect_unrecognized(parsed.options, po::include_positional); 
    if (to_pass_further.size()) 
    { 
    cout << "Unrecognized options:" << endl; 
    for (auto i = to_pass_further.cbegin(); i != to_pass_further.cend(); ++i) 
    { 
     cout << std::left << std::setw(2) << ' ' << *i; 
    return -1; 
    } 
    } 
} 

但因为我会觉得有人这样做所有的时间和图书馆应该处理我们一直在做的所有事情,我错过了一些更清洁的做法吗?

+0

等一下,你有一个函数可以给你一个'vector'中无法识别的选项,并且...你希望它更清洁吗?你究竟想象这个更清洁的界面要做什么? – Yakk

+0

@ po:command_line_parser上的Yakk(或者可能在po :: notify调用)spew,而不是基本抛出异常。 – IdeaHat

+0

什么,在库中打印未本地化的错误消息?这似乎是一个坏主意。 – Yakk

回答

2
try 
{ 
    po::options_description desc("Allowed options"); 

    desc.add_options() 
    ("help,h", "produce help message") 
    ("compression", po::value<int>()->required(), "set compression level") 
    ; 


    po::variables_map vm; 
    po::store(po::parse_command_line(ac, av, desc), vm); 
    po::notify(vm); 
} 
catch(std::exception& e) 
{ 
    std::cerr << "Error: " << e.what() << "\n"; 
    return -1; 
} 
catch(...) 
{ 
    std::cerr << "Unknown error!" << "\n"; 
    return -1; 
}