Namespaces
Variants

std:: char_traits

From cppreference.net
헤더 파일에 정의됨 <string>
template <

class CharT

> class char_traits ;

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

게다가, 표준 특수화들은 또한 멤버 타입 comparison_category std::strong_ordering 로 정의합니다.

(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)
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

참고 항목

문자 시퀀스를 저장하고 조작함
(클래스 템플릿)
읽기 전용 문자열 뷰
(클래스 템플릿)
주어진 추상 장치( std::basic_streambuf )를 래핑하고
고수준 입력 인터페이스를 제공함
(클래스 템플릿)
주어진 추상 장치( std::basic_streambuf )를 래핑하고
고수준 출력 인터페이스를 제공함
(클래스 템플릿)
원시 장치를 추상화함
(클래스 템플릿)