2015-01-12 52 views
1
#include <boost/program_options.hpp> 

#include <iostream> 
#include <string> 
#include <stdexcept> 


void basic_approach(int argc, char const *argv[]) 
{ 
    try 
    {    
     options_description desc{"Options"}; 
     desc.add_options() 
       ("help,h", "Help screen") 
       ("pi,p", value<float>()->default_value(3.14f), "Pi")     
       ("bool,b", value<bool>()->default_value(false), "bool"); 

     variables_map vm; 
     store(parse_command_line(argc, argv, desc), vm); 
     notify(vm); 


     if (vm.count("help")){ 
      std::cout << desc << '\n'; 
     }    
     if (vm.count("pi")){ 
      std::cout << "Pi: " << vm["pi"].as<float>() << '\n'; 
     } 
     if(vm.count("bool")){ 
      std::cout<<"bool: "<<vm["bool"].as<bool>() <<"\n"; 
     } 
    } 
    catch (const error &ex) 
    { 
     std::cerr << ex.what() << '\n'; 
    } 
} 

int main(int argc, char const *argv[]) 
{ 
    basic_approach(argc, argv); 
} 

當我進入"test.exe --pi 334",該工作方案完美無缺。
cannot parse "test.exe --pi334"但拋出異常升壓program_options解析選項和參數一起

"unrecognised option '--pi334'" 

是否有可能提振解析像「--pi334」的選項?非常感謝

+1

我不認爲這是可能的。 AFAIK你可以做'-p334'或_' --pi = 334'或者'--pi 334' – sehe

+0

謝謝,我想-p也可以接受。 – user3689849

回答

1
#include <boost/program_options.hpp> 

#include <iostream> 
#include <string> 
#include <stdexcept> 


void basic_approach(int argc, char const *argv[]) 
{ 
    try 
    {    
     options_description desc{"Options"}; 
     desc.add_options() 
       ("help,h", "Help screen") 
       ("pi,p", value<float>()->default_value(3.14f), "Pi")     
       ("bool,b", value<bool>()->default_value(false), "bool"); 

     command_line_parser parser(argc, argv); 
     parser.options(desc).style(
        command_line_style::default_style | 
        command_line_style::allow_sticky); 
     parsed_options parsed_options = parser.run(); 

     variables_map vm; 
     store(parsed_options, vm); 
     notify(vm); 

     if (vm.count("help")){ 
      std::cout << desc << '\n'; 
     }    
     if (vm.count("pi")){ 
      std::cout << "Pi: " << vm["pi"].as<float>() << '\n'; 
     } 
     if(vm.count("bool")){ 
      std::cout<<"bool: "<<vm["bool"].as<bool>() <<"\n"; 
     } 
    } 
    catch (const error &ex) 
    { 
     std::cerr << ex.what() << '\n'; 
    } 
} 

int main(int argc, char const *argv[]) 
{ 
    basic_approach(argc, argv); 
} 

感謝sehe的幫助下,我只需要和command_line_style :: allow_sticky,使其工作

+0

良好的工作:)謝謝發佈(你可以_show_什麼是現在接受?只是爲了明確任何考慮使用這種方法?) – sehe

+0

@sehe它是-p334之一 – user3689849