2014-01-31 8 views
1

부스트 스피릿을 사용하여 "ABC10DEF20"과 같은 문자열을 ["ABC", 10, "DEF", 20]으로 변환하려고합니다. "undelimited"가 올바른 용어인지 확실하지 않지만 공백이나 다른 구분 문자로 구분하는 대신 정수와 비 정수의 경계로 구분하고 싶습니다. [ 65, 66, 67, 10, 68, 69, 70, 20 ] 결과이 입력 "ABC10DEF20" (끈없이 바로 정수와 정수에 저장되어있는 문자열 부분의 ASCII 구성 요소)의 경우부스트 스피릿을 사용하여 채워지지 않은 문자열과 정수 추출하기

std::string search_str = "ABC10DEF20"; 
std::vector<boost::variant<std::string, unsigned int> > v; 
std::string::const_iterator iter = search_str.begin(); 
std::string::const_iterator last = search_str.end(); 

bool r = parse(iter, last, 
       +(+(char_ - digit)|uint_), 
       v); 

:

내가 좋아하는 코드로 왔어요. 입력 "10"에 대해서는 내가 의도 한대로 [ 10 ]이됩니다.

답변

2

출력 결과에서 문자열이 아닌 개별 문자와 완전한 부호없는 정수가 일치하는 것이 분명합니다.

v의 유형으로 변경해야 할 수 있습니다

bool r = parse(iter, last, 
       +(+(+char_ - digit)|uint_), 
       v); 

을합니다 (이 char_ 전에 +을 추가합니다.) :

그것을 해결하지만 노력 할게요 확실하지 std::vector<boost::variant<std::vector<char>, unsigned int> > v;을하고, 결과를 수정해야 할 수도 있습니다. 부스트 스피릿에 대단히 친숙하지 않습니다. 더 나은, 깨끗한 방법이있을 것입니다.

최종 솔루션 :

사용할 해석 식을 수정

+(as_string[+(char_ - digit)]|uint_) 
+0

이 상기 룰 변경 결과를 만드는 '[65, 66, 67, 49, 48, 68, 69, 70, 50, 48]'그래서 실제로는 정수가 ASCII 문자로 들어 오기 때문에 더 나쁩니다. – eco

+0

또한 + char_는 std :: string으로 변환해야합니다. Boost Spirit 문서에서는 여러 번 작업을 수행합니다. – eco

+0

만약 당신이'digit'에 우선 순위를 부여한다면? 즉'digit - + char_'입니까? –