2013-10-17 64 views
1

我使用的是boost::program_options,這個問題僅僅是美學。增強程序選項:force「=」

如何強制std::string選項(或更好,所有選項)只使用長格式與「=」?

現在,我看到的是「=」被強迫我int選項,而該字符串不使用等號:

po::options_description desc("Allowed options"); 
    desc.add_options() 
     (opt_help, "Show this help message") 
     (opt_int, po::value<int>()->implicit_value(10), "Set an int") 
     (opt_str, po::value<std::string>()->implicit_value(std::string()), "Set a string") 
    ; 

上面顯示所有選項--help--int=4--str FooBar 。我只想以--option=something的形式選擇選項。

我試過一些樣式,但沒找到合適的樣式。

乾杯!

回答

2

沒有編寫自己的解析器,沒有辦法做這樣的事情。

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

std::pair<std::string, std::string> parse_option(std::string value) 
{ 
    if (value.size() < 3) 
    { 
     throw std::logic_error("Only full keys (--key) are allowed"); 
    } 
    value = value.substr(2); 
    std::string::size_type equal_sign = value.find('='); 
    if (equal_sign == std::string::npos) 
    { 
     if (value == "help") 
     { 
     return std::make_pair(value, std::string()); 
     } 
     throw std::logic_error("Only key=value settings are allowed"); 
    } 
    return std::make_pair(value.substr(0, equal_sign), 
    value.substr(equal_sign + 1)); 
} 

// when call parse 

po::store(po::command_line_parser(argc, argv).options(desc). 
extra_parser(parse_option).run(), vm); 

但是,你可以更簡單的方式

void check_allowed(const po::parsed_options& opts) 
{ 
    const std::vector<po::option> options = opts.options; 
    for (std::vector<po::option>::const_iterator pos = options.begin(); 
     pos != options.end(); ++pos) 
    { 
     if (pos->string_key != "help" && 
     pos->original_tokens.front().find("=") == std::string::npos) 
     { 
     throw std::logic_error("Allowed only help and key=value options"); 
     } 
    } 
} 

po::parsed_options opts = po::command_line_parser(argc, argv).options(desc). 
style(po::command_line_style::allow_long | 
po::command_line_style::long_allow_adjacent).run(); 
check_allowed(opts); 

所以做到這一點,在這種情況下的boost :: PO解析,你只需檢查。

+0

太糟糕了,我覺得「總是平等」的風格非常整齊。謝謝! – senseiwa