2009-03-14 4 views
0

문자열의 문자를 대문자로 변환하는 템플릿을 얻으려고했습니다.템플릿 사용

내 프로그램에서 여러 번해야합니다.

그래서 템플릿을 사용하겠습니다.

template <string theString> 
string strUpper(string theString) 
{ 
    int myLength = theString.length(); 
    for(int sIndex=0; sIndex < myLength; sIndex++) 
    { 
     if (97 <= theString[sIndex] && theString[sIndex] <= 122) 
     { 
     theString[sIndex] -= 32; 
     } 
    } 
    return theString; 
} 

템플릿이 작동하는 경우에만! 제안 사항이 있으십니까? '문자열'식별자는 즉각적인 플래그 여야합니다.

+1

왜 이것이 템플릿이 필요합니까? –

+0

문자열은 어떻게 인코딩됩니까? – BigSandwich

+1

Daniel L이 맞습니다. 상단 행을 삭제하면 (strUpper()가 템플릿이 아닌 일반 함수가됩니다) 모든 것이 원하는대로 작동합니다. –

답변

7

당신은 분명히 C++에 대해 이야기합니다 (아직 태그가 없으므로 여기서는 C++이라고 생각합니다). 그럼 당신은 내 템플릿 인수로

을 말하고 싶은 것, 내가 모델 슬프게도 문자열

는 현재 해당 아직 불가능하다고 모든 유형에 동의합니다. 다음 C++ 버전에 포함될 concept 기능이 필요합니다. Here은 그들에 관한 비디오입니다.

당신이 할 수있는 것은 당신이 그것을 다른 또는 사용자 정의 문자열 클래스를 허용하지 않습니다 aswell 좁은 문자열

template <typename CharT, typename TraitsT> 
std::basic_string<CharT, TraitsT> strUpper(basic_string<CharT, TraitsT> theString) { 
    typedef basic_string<CharT, TraitsT> StringT; 
    for(typename StringT::iterator it = theString.begin(); 
     it != theString.end(); 
     ++it) 
    { 
     *it = std::toupper(*it, std::locale()); 
    } 
    return theString; 
} 

넓은 문자열을 수락 할 경우, 예를 들어, 일반적인 유지하려는 경우 basic_string<CharT, TraitsT>을 받아 들일입니다 그게 문자열도 발생합니다. 당신이 것을 원하는 경우에, 완전히 그것을 받아들이는 것을 무료로 무엇을 보관하지

template <typename StringT> 
StringT strUpper(StringT theString) { 
    for(typename StringT::iterator it = theString.begin(); 
     it != theString.end(); 
     ++it) 
    { 
     *it = std::toupper(*it, std::locale()); 
    } 
    return theString; 
} 

당신은 그들이 그 작동하려면 노출이 어떤 기능과 유형이 라이브러리의 사용자에게해야합니다. 컴파일러는 그 계약에 대해 알지 못할 것입니다. 대신 문자열이 아닌 유형의 함수를 호출 할 때 오류 메시지가 발생합니다. 종종 오류 메시지 페이지를 발견 할 수 있으며 오류의 실제 원인을 찾기가 어렵습니다. 표준의 다음 버전에 대해 제안 된 개념 기능은 멋지게 수정합니다. 당신이 한 경우

하지, 그냥 가서 당신이 배우고 그 기능을 발명하려고하지 을 한 경우,이

std::string strUpper(std::string theString) { 
    for(std::string::iterator it = theString.begin(); 
     it != theString.end(); 
     ++it) 
    { 
     *it = std::toupper(*it, std::locale()); 
    } 
    return theString; 
} 

같은 정상적인 기능을 쓸 수와 같은 일반적인 함수를 작성하려는 처음에는 다른 알고리즘을 찾지 못했기 때문에 boost string algorithm 라이브러리를 살펴보십시오. 그런 다음 쓸 수 있습니다

boost::algorithm::to_upper(mystring); 
+0

std :: string을 const ref로 전달하십시오. –

+0

어쨌든 그것을 복사해야합니다. 호출자에게 더 투명 해지고 더 잘 최적화 될 수 있으므로 값으로 가져 오는 것이 좋습니다. –

+0

내가 생각할 수있는 모든 것을 최적화 할 수 있다면 로컬 로캘 개체를 만들고 항상 다시 사용하는 것이 좋습니다. 지금은 항상 새로운 임시 임시 파일을 만듭니다. 하지만 그게 구현 문제라고 생각합니다. 그 남자는 자신의 프로그램에서 그것을 스택에 놓을 것이다. –

관련 문제