std::char_traits
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <string> で定義
|
||
template< class CharT > class char_traits; |
||
char_traits クラスは指定された文字型のための基本文字および文字列操作を抽象化する特性クラステンプレートです。 定義された操作の集合はそれによって汎用のアルゴリズムをほとんど常に実装できるようなものです。 そのため、カスタマイズされた char_traits クラスを提供するだけで、ほとんどあらゆる可能な文字または文字列型でそのようなアルゴリズムを使用することができます。
char_traits クラステンプレートは明示的な実体化のための基礎として提供されます。 ユーザは任意のカスタム文字型に対して特殊化を提供することができます。 標準の文字型に対していくつかの特殊化が定義されます。
特性の操作が例外を投げる場合、動作は未定義です。
標準の特殊化
標準の特殊化のメンバ typedef は以下の通りです。
| 特殊化 | char_type
|
int_type
|
pos_type
|
|---|---|---|---|
std::char_traits<char>
|
char
|
int
|
std::streampos |
std::char_traits<wchar_t>
|
wchar_t
|
std::wint_t | std::wstreampos |
std::char_traits<char16_t> (C++11)
|
char16_t
|
std::uint_least16_t | std::u16streampos |
std::char_traits<char32_t> (C++11)
|
char32_t
|
std::uint_least32_t | std::u32streampos |
std::char_traits<char8_t> (C++20)
|
char8_t
|
unsigned char
|
std::u8streampos |
| メンバ型 | 定義 (すべての標準の特殊化に渡って同じです) |
|---|---|
off_type
|
std::streamoff |
state_type
|
std::mbstate_t |
comparison_category (C++20)
|
std::strong_ordering |
標準の特殊化のメンバ関数のセマンティクスは以下のように定義されます。
| 特殊化 | assign
|
eq
|
lt
|
eof
|
|---|---|---|---|---|
std::char_traits<char>
|
=
|
== (unsigned char に対して)
|
< (unsigned char に対して)
|
EOF |
std::char_traits<wchar_t>
|
=
|
==
|
<
|
WEOF |
std::char_traits<char16_t> (C++11)
|
=
|
==
|
<
|
無効な UTF-16 コードポイント |
std::char_traits<char32_t> (C++11)
|
=
|
==
|
<
|
無効な UTF-32 コードポイント |
std::char_traits<char8_t> (C++20)
|
=
|
==
|
<
|
無効な UTF-8 コードポイント |
char_traits クラステンプレートの標準の特殊化は CharTraits の要件を満たします。
メンバ型
| 型 | 定義 |
char_type
|
CharT
|
int_type
|
char_type のすべての値および EOF を保持できる整数型
|
off_type
|
処理系定義 |
pos_type
|
処理系定義 |
state_type
|
処理系定義 |
メンバ関数
[静的] |
文字を代入します (パブリック静的メンバ関数) |
[静的] |
2つの文字を比較します (パブリック静的メンバ関数) |
[静的] |
ある文字シーケンスを別の文字シーケンスに移動します (パブリック静的メンバ関数) |
[静的] |
文字シーケンスをコピーします (パブリック静的メンバ関数) |
[静的] |
2つの文字シーケンスを辞書的に比較します (パブリック静的メンバ関数) |
[静的] |
文字シーケンスの長さを返します (パブリック静的メンバ関数) |
[静的] |
文字シーケンス内の文字を探します (パブリック静的メンバ関数) |
[静的] |
int_type を同等な char_type に変換します (パブリック静的メンバ関数) |
[静的] |
char_type を同等な int_type に変換します (パブリック静的メンバ関数) |
[静的] |
2つの int_type 値を比較します (パブリック静的メンバ関数) |
[静的] |
eof 値を返します (パブリック静的メンバ関数) |
[静的] |
文字が eof 値かどうか調べます (パブリック静的メンバ関数) |
例
ユーザ定義の文字特性は大文字小文字を区別しない比較を提供するために使用することができます。
Run this code
#include <string>
#include <iostream>
#include <cctype>
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, 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, int n, char a) {
auto const ua (to_upper(a));
while ( n-- != 0 )
{
if (to_upper(*s) == ua)
return s;
s++;
}
return nullptr;
}
};
using ci_string = std::basic_string<char, ci_char_traits>;
std::ostream& operator<<(std::ostream& os, const ci_string& str) {
return os.write(str.data(), str.size());
}
int main()
{
ci_string s1 = "Hello";
ci_string s2 = "heLLo";
if (s1 == s2)
std::cout << s1 << " and " << s2 << " are equal\n";
}
出力:
Hello and heLLo are equal
関連項目
| 文字の並びを格納および操作します (クラステンプレート) |