2015-01-12 3 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); 
} 

을 구문 분석합니다.
그러나 cannot parse "test.exe --pi334"하지만 던져 예외부스트 program_options 옵션과 함께 인수

"unrecognised option '--pi334'" 

부스트는 "--pi334"와 같은 옵션을 구문 분석하는 것이 가능합니까? sehe의 도움을 주셔서 감사합니다 많은

+1

나는 그게 가능하다고 생각하지 않습니다 작동하도록. AFAIK 당신은'-p334'를 할 수 있습니다 _or_'--pi = 334' _or_'--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); 
} 

덕분에, 난 단지에와 command_line_style 필요 :: allow_sticky 그것이

+0

좋은 작품 :) 게시 주셔서 감사합니다 (당신은 _show_ 지금 받아 들여지고 있습니까? 그냥이 접근법을 사용하여 어떤 고려에 대한 명확한?) – sehe

+0

@ sehe 그것은 -p334 하나입니다 – user3689849

관련 문제