std::char_traits
出自 cppreference.com
| 定義於標頭檔 <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 所要求的靜態成員函式
| [靜態] |
指派一個字元 (公開靜態成員函式) |
| [靜態] |
比較兩個字元 (公開靜態成員函式) |
| [靜態] |
將一個字元序列移動到另一個序列 (公開靜態成員函式) |
| [靜態] |
複製一個字元序列 (公開靜態成員函式) |
| [靜態] |
以字典順序比較兩個字元序列 (公開靜態成員函式) |
| [靜態] |
回傳字元序列的長度 (公開靜態成員函式) |
| [靜態] |
在字元序列中尋找字元 (公開靜態成員函式) |
| [靜態] |
將 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
[編輯] 參見
| 儲存並操作字元序列 (類別模板) | |
| (C++17) |
唯讀字串檢視 (string view) (類別樣板) |
| 包裝給定的抽象裝置 (std::basic_streambuf) 並提供高階輸入介面 (類別模板) | |
| 包裝給定的抽象裝置 (std::basic_streambuf) 並提供高階輸出介面 (類別模板) | |
| 抽象化原始裝置 (類別模板) |