2010-08-03 4 views
0

저는이 함수 템플릿을 가지고 있습니다.함수 템플릿

template<class T> T getFromString(const string& inStream) 
{ 
    istringstream stream (inStream); 
    T t; 

    stream >> t; 
    return t; 
} 

이 기능 템플릿을 사용하는 방법에 대해 익숙하지 않습니다. 함수 템플릿을 사용하는 일반적인 방법으로 오류가 발생했습니다. 이 문제에 대해 알려 주시기 바랍니다.

답변

4

이처럼 사용할 수 있습니다

std::string a = "11"; 
int n = getFromString<int>(a); 

이 문자열에서 정수 값을 추출합니다.

실제로 템플리트 내부에 T t = T();을 사용하는 것이 좋습니다. 그러면 확장이 실패하더라도 기본 데이터 유형에 대한 초기화가 보장됩니다.

1

부스트의 힘을 해방 :

int n = boost::lexical_cast<int>("11"); 
+0

과 같이 단순한 사용 사례에 대해 더 복잡하게 뒤섞이는 반면이 질문은 답변에 아무런 답변이되지 않는다는 것입니다. –

+0

실제로는 사용법이 완전히 동일 함을 알 수 있습니다. 그러나 나는 특히 lexical_cast가 신중한 튜닝으로 인해 정수형에서 훨씬 더 빠를 때 휠을 재발 명하지 않을 것을 강력하게 믿는다.) –

0

문제는 컴파일러는 함수의 유형을 추론하는 반환 형식을 사용할 수 없다는입니다. @Naveen이 이미 언급 한대로 함수 호출의 일부로 원하는 형식을 명시 적으로 제공해야합니다 : getFromString<int>("123").

template <typename T> 
void getFromString(const std::string & str, T & value) { ... } 
int main() { 
    int x; 
    getFromString("123",x); 
} 

당신이 전화를 입력 T의 변수를 제공 할 때, 컴파일러는 지금에서 유형을 추론 할 수있다 : 또 다른 방법은 인수로 유형을 수신 반환하는 그래서 대신 함수 서명을 변화 인수. (xint이므로 getFromString<int>)로 전화하십시오. 단점은 변수를 미리 만들어야하고 사용자 코드가 int n = getFromString<int>("123");