命名空間
變體
動作

std::char_traits

出自 cppreference.com
< cpp‎ | string
定義於標頭檔 <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 所要求的靜態成員函式

[靜態]
指派一個字元
(公開靜態成員函式) [編輯]
[靜態]
比較兩個字元
(公開靜態成員函式) [編輯]
[靜態]
將一個字元序列移動到另一個序列
(公開靜態成員函式) [編輯]
[靜態]
複製一個字元序列
(公開靜態成員函式) [編輯]
[靜態]
以字典順序比較兩個字元序列
(公開靜態成員函式) [編輯]
[靜態]
回傳字元序列的長度
(公開靜態成員函式) [編輯]
[靜態]
在字元序列中尋找字元
(公開靜態成員函式) [編輯]
int_type 轉換為等效的 char_type
(公開靜態成員函式) [編輯]
[靜態]
char_type 轉換為等效的 int_type
(公開靜態成員函式) [編輯]
[靜態]
比較兩個 int_type
(公開靜態成員函式) [編輯]
[靜態]
回傳一個 eof
(公開靜態成員函式) [編輯]
[靜態]
檢查字元是否為 eof
(公開靜態成員函式) [編輯]

[編輯] 附註

CharTraits 不要求上述的類型與函式定義為直接成員,它僅要求像 X::type 這樣的類型,以及像 X::func(args) 這樣的運算式有效並具有所需語意。使用者自訂的字元特徵可以繼承自其他字元特徵類別,並僅覆寫其中部分的成員,請參閱下方的範例。

[編輯] 範例

使用者自訂的字元特徵可用於提供不區分大小寫的比較

#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

[編輯] 參見

儲存並操作字元序列
(類別模板) [編輯]
唯讀字串檢視 (string view)
(類別樣板) [編輯]
包裝給定的抽象裝置 (std::basic_streambuf)
並提供高階輸入介面
(類別模板) [編輯]
包裝給定的抽象裝置 (std::basic_streambuf)
並提供高階輸出介面
(類別模板) [編輯]
抽象化原始裝置
(類別模板) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)