std:: char_traits
|
헤더 파일에 정의됨
<string>
|
||
|
template
<
class
CharT
|
||
char_traits
클래스는 주어진 문자 타입에 대한 기본적인 문자 및 문자열 연산을 추상화하는 특성(traits) 클래스 템플릿입니다. 정의된 연산 집합은 일반적인 알고리즘이 거의 항상 이를 기반으로 구현될 수 있도록 구성됩니다. 따라서 사용자 정의
char_traits
클래스를 제공하기만 하면 거의 모든 문자 또는 문자열 타입으로 이러한 알고리즘들을 사용할 수 있습니다.
char_traits
클래스 템플릿은 명시적 인스턴스화의 기초 역할을 합니다. 사용자는
특수화를 제공
하여 사용자 정의 문자 타입을 구현할 수 있습니다. 표준 문자 타입에 대해 여러 명시적 특수화가 제공되며 (아래 참조), 다른 특수화들은
CharTraits
요구 사항을 충족할 필요가 없습니다.
목차 |
특수화
표준 라이브러리는 다음과 같은 표준 특수화를 제공합니다:
|
헤더 파일에 정의됨
<string>
|
|
| std :: char_traits < char > | char 의 표준 문자 특성 |
| std :: char_traits < wchar_t > | wchar_t 의 표준 문자 특성 |
| std :: char_traits < char8_t > (C++20) | char8_t 의 표준 문자 특성 |
| std :: char_traits < char16_t > (C++11) | char16_t 의 표준 문자 특성 |
| std :: char_traits < char32_t > (C++11) | char32_t 의 표준 문자 특성 |
이 모든 특수화들은 CharTraits 요구사항을 충족합니다.
멤버 타입
표준 특수화는 다음의 멤버 타입들을 정의하며, 이는 CharTraits 요구 사항에 필요합니다:
CharT
|
멤버 타입 | ||||
|---|---|---|---|---|---|
char_type
|
int_type
|
off_type
|
pos_type
|
state_type
|
|
| char | char | int | std::streamoff | std::streampos | std::mbstate_t |
| wchar_t | wchar_t | std::wint_t | std::wstreampos | ||
| char8_t | char8_t | unsigned int | std::u8streampos | ||
| char16_t | char16_t | std::uint_least16_t | std::u16streampos | ||
| char32_t | char32_t | std::uint_least32_t | std::u32streampos | ||
|
게다가, 표준 특수화들은 또한 멤버 타입
|
(C++20부터) |
멤버 함수
표준 특수화는 CharTraits 에서 요구하는 다음 정적 멤버 함수들을 정의합니다:
|
[static]
|
문자를 할당함
(public static member function) |
|
[static]
|
두 문자를 비교함
(public static member function) |
|
[static]
|
한 문자 시퀀스를 다른 시퀀스로 이동함
(public static member function) |
|
[static]
|
문자 시퀀스를 복사함
(public static member function) |
|
[static]
|
두 문자 시퀀스를 사전순으로 비교함
(public static member function) |
|
[static]
|
문자 시퀀스의 길이를 반환함
(public static member function) |
|
[static]
|
문자 시퀀스에서 문자를 찾음
(public static member function) |
|
[static]
|
int_type
을 동등한
char_type
으로 변환함
(public static member function) |
|
[static]
|
char_type
을 동등한
int_type
으로 변환함
(public static member function) |
|
[static]
|
두
int_type
값을 비교함
(public static member function) |
|
[static]
|
eof
값을 반환함
(public static member function) |
|
[static]
|
문자가
eof
값인지 확인함
(public static member function) |
참고 사항
CharTraits
는 위에 나열된 타입과 함수들을 직접 멤버로 정의할 것을 요구하지 않으며,
X::type
와 같은 타입들과
X
::
func
(
args
)
와 같은 표현식들이 유효하고 요구되는 의미론(semantics)을 가지기만을 요구합니다. 사용자 정의 문자 특성은 다른 문자 특성 클래스들로부터 파생될 수 있으며 일부 멤버들만 재정의할 수 있습니다. 아래 예제를 참조하십시오.
예제
사용자 정의 문자 특성은 대소문자 구분 없는 비교 를 제공하는 데 사용될 수 있습니다:
#include <cctype> #include <iostream> #include <string> #include <string_view> struct ci_char_traits : public std::char_traits<char> { static char to_upper(char ch) { return std::toupper((unsigned char) ch); } static bool eq(char c1, char c2) { return to_upper(c1) == to_upper(c2); } static bool lt(char c1, char c2) { return to_upper(c1) < to_upper(c2); } static int compare(const char* s1, const char* s2, std::size_t n) { while (n-- != 0) { if (to_upper(*s1) < to_upper(*s2)) return -1; if (to_upper(*s1) > to_upper(*s2)) return 1; ++s1; ++s2; } return 0; } static const char* find(const char* s, std::size_t n, char a) { const auto ua{to_upper(a)}; while (n-- != 0) { if (to_upper(*s) == ua) return s; s++; } return nullptr; } }; template<class DstTraits, class CharT, class SrcTraits> constexpr std::basic_string_view<CharT, DstTraits> traits_cast(const std::basic_string_view<CharT, SrcTraits> src) noexcept { return {src.data(), src.size()}; } int main() { using namespace std::literals; constexpr auto s1 = "Hello"sv; constexpr auto s2 = "heLLo"sv; if (traits_cast<ci_char_traits>(s1) == traits_cast<ci_char_traits>(s2)) std::cout << s1 << " and " << s2 << " are equal\n"; }
출력:
Hello and heLLo are equal
참고 항목
|
문자 시퀀스를 저장하고 조작함
(클래스 템플릿) |
|
|
(C++17)
|
읽기 전용 문자열 뷰
(클래스 템플릿) |
|
주어진 추상 장치(
std::basic_streambuf
)를 래핑하고
고수준 입력 인터페이스를 제공함 (클래스 템플릿) |
|
|
주어진 추상 장치(
std::basic_streambuf
)를 래핑하고
고수준 출력 인터페이스를 제공함 (클래스 템플릿) |
|
|
원시 장치를 추상화함
(클래스 템플릿) |