2014-10-18 110 views
1

我試圖允許使用boost的「多空」選項(版本1.46)。我的印象是,使*僞裝*助推風格將允許這樣的事情。鑑於此代碼:C++ boost程序選項允許長期選項

// Declare the supported options. 
    boost::program_options::options_description desc("Allowed options"); 
    desc.add_options() 
    ("help,h", "produce help message") 
    ("RunTimeE,rtttt", boost::program_options::value<std::string>(), "RunTimeE Version") 
    ; 

    boost::program_options::variables_map vm; 
    boost::program_options::store(boost::program_options::command_line_parser(argc, argv) 
           .options(desc) 
           .style(boost::program_options::command_line_style::unix_style 
             | boost::program_options::command_line_style::allow_long_disguise) 
           .run(), 
           vm); 

    boost::program_options::notify(vm);  

    if (vm.count("help")) { 
    cout << desc << "\n"; 
    return 1; 
    } 
    if (vm.count("RunTimeE")) { 
    cout << vm["RunTimeE"].as<std::string>() << endl; 
    return 1; 
    } 

會產生:

./output --help 
Allowed options: 
    -h [ --help ]   produce help message 
    -r [ --RunTimeE ] arg RunTimeE Version 

但我希望它產生:

./output --help 
Allowed options: 
    -h [ --help ]    produce help message 
    -rtttt [ --RunTimeE ] arg RunTimeE Version 

任何人都可以在這方面幫助?

謝謝。

+0

如果不編寫自己的[自定義分析器](http://www.boost.org/doc/libs/1_56_0/doc/html/program_options/howto.html),我不確定這是可能的。您正在指定一個長選項'RunTimeE'和一個簡短選項'rtttt',但短期選項根據定義只有一個字符。你可以通過指定'allow_long_disguise'來使用長選項,但我沒有看到允許你有兩個長選項。事實上,長期和短期有兩個長期選擇的點是什麼? – sjdowling 2014-10-18 13:31:18

回答

0

是否可以創建兩個長選項?

如果你不認爲這是很好的具有相同設定int他變圖相關的兩個值,它指的是相同的設置:

Live On Coliru

輸出:

echo ------; ./a.out -h 
echo ------; ./a.out -rtttt asdasdads 
echo ------; ./a.out -RunTimeE qwe7 
echo ------; ./a.out --rtttt 99 
------ 
Allowed options: 
    -h [ --help ]   produce help message 
    --RunTimeE arg  RunTimeE Version 
    --rtttt arg   RunTimeE Version 

------ 
vm[rtttt]: asdasdads 
optRunTimeE: asdasdads 
------ 
vm[RunTimeE]: qwe7 
optRunTimeE: qwe7 
------ 
vm[rtttt]: 99 
optRunTimeE: 99 

列表:

#include <boost/program_options.hpp> 
#include <iostream> 

namespace po = boost::program_options; 

int main(int argc, char **argv) { 
    // Declare the supported options. 
    boost::program_options::options_description desc("Allowed options"); 

    std::string optRunTimeE; 
    desc.add_options() 
     ("help,h", "produce help message") 
     ("RunTimeE", boost::program_options::value<std::string>(&optRunTimeE), "RunTimeE Version") 
     ("rtttt", boost::program_options::value<std::string>(&optRunTimeE), "RunTimeE Version") 
     ; 

    boost::program_options::variables_map vm; 
    boost::program_options::store(
      boost::program_options::command_line_parser(argc, argv) 
      .options(desc) 
      .style(
       boost::program_options::command_line_style::unix_style | 
       boost::program_options::command_line_style::allow_long_disguise) 
      .run(), 
      vm); 

    boost::program_options::notify(vm); 

    if (vm.count("help")) { 
     std::cout << desc << "\n"; 
     return 1; 
    } 

    if (vm.count("RunTimeE")) std::cout << "vm[RunTimeE]: " << vm["RunTimeE"].as<std::string>() << std::endl; 
    if (vm.count("rtttt")) std::cout << "vm[rtttt]: " << vm["rtttt"].as<std::string>() << std::endl; 

    std::cout << "optRunTimeE: " << optRunTimeE << std::endl; 
} 
+0

這不適用於bool開關:'po :: bool_switch() - > default_value(false)'。您必須根據每個標誌分別處理它們,並決定如何處理標誌複製/交叉點。除了升壓代碼之外,這還有一個額外的代碼。 – Andry 2017-12-24 17:03:40

+0

@很好的觀察。這是一個解決方法,不要太過分,通過替換默認通知程序:http://coliru.stacked-crooked.com/a/ed32d31cb8f32572 – sehe 2017-12-25 01:26:39