2011-01-04 4 views
4

클래스 중 하나에서 템플릿은 클래스의 동작을 사용자 정의 할 수 있다고 말한 다음 문자열 클래스의 예를 보여주었습니다. 몇 줄의 코드로 STL에서 문자열 클래스를 사용자 정의 할 수 있습니다. 에서 우리는 'a'와 'z'를 동일하게 처리하고 'b'와 'y'를 동일하게 처리하고 'c'와 'x'를 동일하게 처리 할 수 ​​있습니다. Similary 'A'와 'Z'same 등사용자 정의 동작을 사용하여 문자열 클래스를 구현하십시오.

"abc"== "zyx"는 참입니다.
"Abc"== "zyx"는 거짓입니다.
는 "ABC는 =="ZYX "는 사실이다.

는 등

나는 그런 캐릭터 클래스를 구현하는 생각,하지만 난 그렇게 할 수 없습니다 나는 우리가 어떻게 템플릿을 사용하여 같은 문자열 클래스를 구현할 수

?
+1

은 나뿐만 아니라 C++에 새로 온 사람하지만이 함께 할 수있는 뭔가가 생각 캐릭터 특성. – dreamlax

답변

3

매우 까다 롭습니다. 단지 EQ를 (재정) 작동하지 않을 것입니다 : 당신이 당신의 자신의 특성 클래스를 작성 할 필요가있는, 특별히 당신은 char_traits<> 클래스 템플릿에서 파생하고 EQ()것은() 기능 (참고 비교할를 재정의 할 필요가 compare()의 재정의에 변경이 없더라도 파생 클래스에 그대로 작성해야합니다.). 이 특성 클래스 sequence_traits을 말하고 사용자 지정 문자열 sequence을 호출합니다. 결국 문자열은 일련의 문자입니다!

참고 : 나는 그래서 당신의 의미는 alphabets[i] == alphabets[25-i]이 동일하게 취급 할 후, 첫 글자와 같은 마지막 문자, 두 번째 문자와 같은 초 마지막 글자, 그리고에서 이해 무엇!

struct sequence_traits : char_traits<char> 
{ 
    //'a' and 'z' are equal 
    //'b' and 'y' are equal 
    //'c' and 'x' are equal, and so on. 
    //that implies, 'a' + 'z' == 'b' + 'y' == 'c' + 'x' == 'd' + 'w == so on 
    //same for upper cases! 
    static bool eq(const char& left, const char& right) 
    { 
     return (left == right) || (left + right == 'a' + 'z') || (left + right == 'A' + 'Z') ; 
    } 
    static int compare(const char *first1, const char *first2, size_t count) 
    { 
     for (; 0 < count; --count, ++first1, ++first2) 
      if (!eq(*first1, *first2)) 
       return (lt(*first1, *first2) ? -1 : +1); 
     return (0); 
    } 
}; 

그리고 당신은 쉽게 사용이 typedef을 할 수는 :

typedef basic_string<char, sequence_traits> sequence; 

당신은 완료됩니다. 지금 sequence을 사용할 수 있습니다.:-)

근무 예 : http://www.ideone.com/ByBRV


그것이 구체적으로 어떻게 작동하는지 알고이 기사를 읽기 : http://www.gotw.ca/gotw/029.htm

+0

C++에 대해서는 잘 모르겠지만 C에서는 밑줄과 대문자 (즉, _Left 및 _Right)로 시작하는 식별자가 예약되어 있으며이를 사용하면 정의되지 않은 동작이 발생합니다. – dreamlax

+0

@dreamlax : 누가 그렇게 말 했나요? – Nawaz

+2

@Nawaz : C++ 표준에서 §17.4.3.1.2는 밑줄에 관한 예약 된 식별자를 정의하고 §17.4.3.1 단락 3은 예약 된 식별자를 사용하는 동작을 정의합니다. – dreamlax

2

char_traits 유형을 살펴 보는 것이 좋습니다. 작동하는 문자열 유형을 얻기 위해 basic_string과 함께 사용할 수있는 한 가지 유형의 특성 클래스의 예입니다. 고유 한 특성 클래스를 정의하면 다음을 수행 할 수 있습니다. 다음과 같이 맞춤 문자열을 만드십시오.

class CustomTraits { ... }; 
typedef basic_string<char, CustomTraits> CustomString; 

이제 CustomLog가 정의한 특성을 사용하여 문자열의 작동 방식을 결정합니다. 당신이 말하는 있었는지의 라인을 따라 예를 들어

, 당신은 같은 것을 할 수있는 : 이제

class CustomTraits: public char_traits<char> { 
public: 
    /* Redefine equality to compare 'a' and 'z' equal. */ 
    static bool eq(char one, char two) { 
     return one == two || (one == 'a' && two == 'z' || one == 'z' && two == 'a'); 
    } 
}; 
typedef basic_string<char, CustomTraits> StringWithAAndZEqual; 

, 당신은 새로운 유형을 사용할 수 있으며 클래스 'A'와 'Z'를 취급을 동일하게.

+0

@templatetyepdef : 나는 이것이 그가 원하는 것이 아닐 것이라고 생각한다. 이것은 'a'와 'x'만을 동등하게 취급하지만 'b'와 'y', 'c'와 'x'와 같은 다른 모든 쌍은 취급하지 않습니다. 나는 그가 원하는 것은''alphabets [i] == alphabets [25-i]'는 똑같은 것으로 취급되어야한다고 생각합니다. 즉 첫 글자와 마지막 글자, 둘째 글자와 두번째 마지막 글자가 같다는 의미입니다! – Nawaz

+1

이 작동하지 않습니다. 그것은 'a'와 'z'가 아니라 'b'와 'y'등의 쌍으로 작동합니다. –

+1

사과드립니다. 질문을 잘못 읽었습니다. 이것은 대부분 개념 증명이었습니다. (lt, compare 등과 같은) 누락 된 몇 가지 다른 것들이 있습니다. – templatetypedef

2

사용자 지정 char_traits을 만들고 std::basic_string을 인스턴스화하려고합니다.

+0

'=='연산자로 다른'char_traits'를 가지고 있다면 여전히 두 개의 std :: basic_string을 비교할 수 있습니까? – dreamlax

+1

순진하지 않습니다. my_string이 커스텀 스트링의 인스턴스라면, 당신은'my_string == a_std_string.c_str()'와 같은 것을 할 필요가있을 것이다. 스트림에서 스트림을 사용하는 경우에도 마찬가지입니다. 아마도'std :: basic_string <> :: c_str()'을 사용해야 할 것입니다. – wilhelmtell

관련 문제