2013-05-28 2 views
0

다른 유형의 여러 값을 보유하고있는 string values = "hello 2 88.9 true"과 같은 문자열이 있다고 가정 해 보겠습니다. 적절한 타입 (여기에는 문자열, int, float 및 bool)으로 선언 된 여러 변수가 있습니다.구문 분석 형식 이름

field0 = getValue(0,values); 
field1 = getValue(1,values); 
... etc 

그래서 내가 원하는 것은 누구의 반환 유형 해당 필드의 유형과 일치하는 getValue입니다 : 내가 기본적으로하고 싶은 것은 이것이다. 이것은 단순한 템플릿으로 가능합니까? 템플릿 함수의 매개 변수에 템플릿 유형을 지정하지 않고 사용할 반환 유형을 지정할 수없는 것 같습니다. 함수 자체의 몸체는 아마도 boost의 lexical_cast와 stringstream을 사용할 것입니다.하지만 더 나은 솔루션을 가지고 있다면, 저는 그것도 잘 알고 있습니다!

내가 설명을 대단히 감사하겠습니다 그래서 템플릿에 새로운 해요 ...

답변

0
using std::stringstream; 
using std::string; 

string a; 
int b; 
double c; 
bool d; 

string values = "hello 2 88.9 true"; 
stringstream in(values); 
in >> a >> b >> c >> std::boolalpha >> d; 
+0

이 끈적 거리는을 보이는 : 나는 그것을 원유 -하지만 효율적인 방법을 할 수 d, 고마워! stringstream에 의해 처리되지 않는 bool과 같은 다른 유형이 있습니까? 'values' 문자열은 실제로 TCP 포트에서 들어오는 것입니다. 런타임 전에 무엇을 수신하는지 알 필요가 없습니다. 하지만 나는 분명히 불쾌한 놀라움을 가지기를 원치 않으므로 코드를 가능한 한 일반적인 것으로 만들고 싶습니다. – wrousseau

+0

입력이 "1 2.3 true"인 경우 첫 번째 문자열 필드가없는 경우 변수 a, b, c 및 d는 각각 1, 2, 0.3, true가됩니다. 그러나 입력이 잘못 되었기 때문에 그것을 해석 할 올바른 방법이 없습니다. –

0

나는 이런 식으로 할 거라고 :

#include <sstream> 
... 
std::stringstream ss; 
ss << values; 
ss >> field0 >> field1 >> field2 >> field3; 

내가 정말 getValue 기능으로 원하는 경우,

template<typename T> 
void getValue(unsigned int n, string str, T &val) 
{ 
    string junk; 
    std::stringstream ss(str); 
    for(unsigned int k=0; k<n; ++k) 
    ss >> junk; 
    ss >> val; 
    return; 
}