2012-04-16 4 views
5

boost::program_options을 사용하여 응용 프로그램에 명령 줄 구문 분석 인터페이스를 제공합니다. 옵션을 구문 분석하도록 구성하고 싶습니다. 마지막 스위치 이후의 모든 토큰이 벡터 형식으로 반환되도록 구성하고 싶습니다. 부스트 문서에서 주어진 예제에 따라 collect_unrecognized을 사용 해봤지만 입력 파일에 위치 지정 인수를 사용하기 때문에 몇 가지 문제가 발생했습니다.boost :: program_options에서 원하지 않는 매개 변수를 처리하는 방법

기본적으로 나는 이렇게하고 싶습니다. 내가있는 경우 :

./program -i "inputfile.abc" argument1 argument2 argument3 

나는 그것이 input-fileinputfile.abc을 저장하고 vector<string>argument1, argument2argument3 등의 원치 않는 인수를 반환하고 싶습니다.

그러나 나는 또한

./program "inputfile.abc" argument1 argument2 argument3 

나에게 동일한 결과를 줄 것이다 있도록하는 위치 인수를 가질 수 있도록하고 싶습니다.

이미 문의 해 주셔서 감사 드리며 도움을 주셔서 감사합니다.

답변

3

트릭을 수행하는 코드가 있었지만 약간의 해결 방법입니다. 즉, 위치 조건 절을 삭제하고 인식 할 수없는 항목의 첫 번째 인수를 취하는 것에 의지했습니다. 그것은 잘 작동하는 것,하지만 그것은 매우 유연하지 않습니다.

using namespace boost::program_options; 

options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file") 
    ; 

variables_map vm; 
vector<string> additionalParameters; 

parsed_options parsed = command_line_parser(ac, av). 
    options(desc).allow_unregistered().run(); 
store(parsed, vm); 
additionalParameters = collect_unrecognized(parsed.options, 
    include_positional); 
notify(vm); 

if (!vm.count("input-file")) 
    if (additionalParameters.empty()) 
    { 
     cerr << "error: No input file specified\n"; 
     return EXIT_FAILURE; 
    } 
    else 
    { 
     inputFileName = additionalParameters[0]; 
     additionalParameters.erase(additionalParameters.begin()); 
    } 
else 
    inputFileName = vm["input-file"].as<string>(); 
관련 문제