2011-02-25 3 views
2

부스트 v1.45.0 프로그램 옵션을 사용하는 Visual Studio 2008 C++ 응용 프로그램이 있습니다.부스트 프로그램 옵션을 사용하는 잘못된 옵션 값 예외

foo.exe -x 1,2, 4-7과 같은 명령 줄 옵션을 구문 분석하여 [1, 2, 4, 5, 6, 7] 값을 가진 std::vector<int>을 생성하고 싶습니다. 그래서, 나는 사용자 정의 검사기를 작성했습니다 :

typedef std::vector<int> IDList; 

void validate(boost::any& v, const std::vector<std::string>& tokens, IDList*, int) 
{ 
    // Never gets here 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    IDList test_case_ids; 

    po::options_description desc("Foo options"); 
    desc.add_options() 
     ("id,x", po::value<IDList>(), "Specify a single ID or a range of IDs as shown in the following command line: foo.exe -x10,12, 15-20") 
    ; 

    po::variables_map vm; 

    try 
    { 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 
    } 
    catch(const std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
     std::cout << desc << std::endl; 
     return 1; 
    } 

    return 0; 
} 

그러나 나는 사용자 정의 검사기 코드를 얻지 못합니다. 항상 parse_command_linein option 'id': invalid option value이라는 메시지가있는 예외가 발생합니다.

원하는대로이 작업을하려면 어떻게해야합니까?

감사합니다, PaulH

+0

실행 중 명령 줄은 무엇입니까? – Dennis

+0

BTW - UNICODE를 사용하여 컴파일 중입니까?이 경우 라이브러리 작업의 wstring 버전을 사용해야합니다. – Dennis

+0

@Dennis - 명령 행은'foo.exe -x 1,2, 4-7'입니다. 예, 유니 코드 플래그로 컴파일 중입니다. 'std :: wstring'으로 변경해도 결과는 변경되지 않습니다. 나는 같은 예외를 얻는다. – PaulH

답변

1

typedef입니다 당신이 vector 프로그램 옵션 라이브러리에 special meaning을 가지고 있기 때문에 원하는 방식으로 작동하지 않는 boost::program_options::value_semanticstd::vector<int> :

라이브러리는 벡터에 대한 특별 지원 를 제공합니다 - - 옵션을 여러 번 지정할 수 있으며 지정된 모든 값이 하나의 벡터에 으로 수집됩니다. 그래서

typedef std::vector<int> IDList; 
po::options_description desc("Foo options"); 
desc.add_options() 
    ("id,x", po::value<IDList>(), "list of IDs") 
; 

같은 설명 수단

다음 명령 행

a.out --id 1 --id 2 --id 3 --id 4 

결과가 std::vector 네와 소자 될 주어진 하나 std::vector<int>에 합체된다. 사용자 정의 유효성 검사기를 사용하려면 특정 유형을 정의해야합니다. struct IDListcorrect approach입니다.

+0

그건 의미가 있습니다. 감사! – PaulH

+0

이 경우 유형 (def) IDList가 '마법'이라고 말하는 것입니까? 즉, 다른 이름이 아닌 IDList라고해야합니다. –

0
는 명령 줄 옵션 구문 분석하는 데 자신의 함수를 작성 시도 할 수

: See here

당신은 예를 들어, 자신의 파서 기능을 쓰기 다음과 같이 reg_foo, 그리고 그것을 사용 :

variables_map vm; 
store(command_line_parser(argc, argv).options(desc).extra_parser(reg_foo) 
      .run(), vm); 

이 문제는 IDList의 정의입니다 예/custom_syntax.cpp

+0

나는 그것을 할 수 있다고 가정하지만'-x' 옵션에 대해서만 커스텀 파서 만 필요합니다. 그게 사용자 정의 유효성 검사기에 대한 것이라고 생각 했나요? – PaulH

0

에서, 또한 부스트와 함께 배포 된 예제 코드를 참조하십시오. regex.cpp 샘플에 사용 된 magic_number 유형과 일치하도록 정의를 변경하면 작동합니다.

struct IDList 
{ 
public: 
    std::vector<int> ids_; 
    IDList(std::vector<int> ids) : ids_(ids) {} 
}; 

typedef이 프레임 워크에 대한 문제가 왜 조사하지 않은,하지만이 작동합니다.

-PaulH

+0

2 일 동안 수락 할 수없는 경우 답변을 게시 할 수있는 시점은 무엇입니까? – PaulH

+0

다른 답변을 장려하기 위해 자신의 질문에 대답하여 담당자를 얻을 수 없습니다. –

+0

@Sam - 잘 모르겠습니다. "2 일 동안 답변으로 표시 할 수 없다면 왜 대답을 게시하지 않습니까?"라는 의미였습니다. – PaulH