당신은 분명히 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);
왜 이것이 템플릿이 필요합니까? –
문자열은 어떻게 인코딩됩니까? – BigSandwich
Daniel L이 맞습니다. 상단 행을 삭제하면 (strUpper()가 템플릿이 아닌 일반 함수가됩니다) 모든 것이 원하는대로 작동합니다. –