2017-04-13 10 views
0

좋은 하루,C++ 템플릿이 문자열 유형 일 때 LOWcase 변환 만 수행

템플릿을 사용하여 간단한 C++ 링크 된 목록을 작성하고 있습니다. 나는 모든 것을 작동시키지 만, 템플릿이 string 형일 때 모든 문자를 소문자로 변환하여 대소 문자를 구분하지 않고 기능에 추가하려고했다.

그래서, 나는 어떤 단어를 처리하고 모든 소문자로 변환 다음 코드를 썼다 :

 #define TEMPLATE string // changing this changes the template type in the rest of the program 
     Stack <TEMPLATE> s; //not used in this example, but just to show that I have an actual template for a class declared at some point, not just a definition called TEMPLATE 
     TEMPLATE word; // User inputs a word that is the same type of the Linked List Stack to compare if it is in the Stack. 
     cin >> word; // just showing that user defines word 
     for (unsigned int i = 0; i < word.length(); i++) 
     { 
      if (word.at(i) >= 'A' && word.at(i) <= 'Z') 
       word.at(i) += 'a' - 'A'; 
     } 

문제는 스택 내 스택의 템플릿과 이후 비교 단어가 될 때 string 타입이 아니라면 for 루프가 특별히 문자열을보기 위해 작성 되었기 때문에 분명히 오류 메시지를 던집니다.

그래서이 함수를 더 일반화하여 모든 유형을 전달할 수있는 방법이 있습니까? (나는 그렇게 생각하지 않는다. int를 검사하는 에러가 없기 때문에 문자열 만이 이것에 의존하는 문자열이다.)

아니면 위의 코드를 실행할 수있는 방법이 있는가? 내 스택 및 비교 변수에 대한 템플릿이 string 유형입니까?

필자는 파이썬이 어떻게 작동하는지에 익숙하지 않아서 C++로 구현하는 방법을 정확히 알지 못한다는 점을 제외하면 예외 처리를 살펴 보았습니다.

사이드 노트와 마찬가지로, 문자열을 모든 소문자로 변환하는 내장 함수를 사용하지 않으므로이 옵션도 옵션이 아니므로 해당 옵션을 추천하지 않습니다.

+0

매크로는 아니다 ++. 내 말은,'template' 키워드조차도 ... 솔루션은 템플릿 전문 분야입니다. 그렇지만 매크로 hackery가 아닌 실제 C++ 템플릿을 사용해야합니다. – StoryTeller

+0

이 스 니펫이 혼란 스럽거나 여전히 잘못하고 있는지 확실하지 않습니다. My Stack 클래스는 템플릿으로 설계되었습니다. 나도 쉽게 쓸 수 Stack Stack s; 그리고 문자열 단어를 사용했지만이 두 변수 유형이 함께 변경되도록하고 싶었습니다. 이것을 할 수있는 적절한 방법이 있다면 올바른 방향으로 나를 가르키면 좋을 것입니다. 나는 이것에 관해서 다른 곳에서는 아무 것도 보지 못했다. 그래서 나는 그것을하지 않았다. 감사. –

+0

나는 혼란스러워하지 않는다. 이것은 클래스 템플릿에 관한 것이 아니라 함수 템플릿에 대한 해킹입니다. – StoryTeller

답변

4

데이터를 정상화 과부하를 만들기 : 당신이 C에서 템플릿을 어떻게

std::string normalize(const std::string& s) { 
    std::string res(s); 
    for (auto& c : res) { 
     c = std::tolower(c); 
    } 
    return res; 
} 

template <typename T> 
const T& normalize(const T& t) { return t; } 
+0

'return res;가 누락되었습니다. –

+0

@JosephIreland : 고마워요. – Jarod42