C++ 名前付き要件: CharTraits
From cppreference.com
CharTraits は、指定された文字型に対する基本的な文字および文字列操作を抽象化するトレイトクラスです。ほとんどの標準ライブラリの文字列クラスや入出力クラスは、対応する文字テンプレート型パラメータとともに CharTraits テンプレート型パラメータを必要とします。
目次 |
[編集] 要件
CharTraits に対して以下にリストされている操作はいずれも例外を投げないものとします。
以下を考えます。
-
CharT、文字型 -
X、型CharTに対する CharTraits 型 - c、d、型
CharTの値 - p、q、型 const CharT* の値
- s、型
CharT*の値 - n、i、j、型 std::size_t の値
- e、f、型
X::int_typeの値 - pos、型
X::pos_typeの値 - state、型
X::state_typeの値 - r、型
CharTの左辺値
[編集] 型
| 型 | セマンティクス |
|---|---|
X::char_type |
CharT
|
X::int_type |
X::char_type のすべての有効な値に加えて X::eof() を保持できる型 |
X::off_type |
X が入出力クラスでトレイトテンプレートパラメータとして使用されている場合、std::streamoff でない場合は実装定義の動作を呼び出します。 |
X::pos_type |
|
X::state_type |
Destructible、CopyAssignable、CopyConstructible、DefaultConstructible |
[編集] 式
| Expression | 戻り値の型 | セマンティクス | 計算量 |
|---|---|---|---|
| X::eq(c, d) | bool | 戻り値: c が d と等しいとみなされるかどうか | Constant |
| X::lt(c, d) | bool | 戻り値: c が d より小さいとみなされるかどうか | Constant |
| X::compare(p, q, n) | int | 戻り値
|
線形 |
| X::length(p) | std::size_t | 戻り値: X::eq(p[i], CharT()) が true となる最小の i | 線形 |
| X::find(p, n, c) | const X::char_type* | 戻り値
|
線形 |
| X::move(s, p, n) | X::char_type* |
|
線形 |
| X::copy(s, p, n) | X::char_type* |
|
線形 |
| X::assign(r, d) | (使用されません) | r = d を代入します。 | Constant |
| X::assign(s, n, c) | X::char_type* |
|
線形 |
| X::not_eof(e) | X::int_type |
戻り値
|
Constant |
| X::to_char_type(e) | X::char_type |
戻り値
|
Constant |
| X::to_int_type(c) | X::int_type |
戻り値: ある値 e。X::to_char_type および X::eq_int_type の定義によって制約されます。 |
Constant |
| X::eq_int_type(e, f) | bool |
|
Constant |
| X::eof() | X::int_type |
戻り値: ある値 e。すべての値 c について X::eq_int_type(e, X::to_int_type(c)) が false である。 | Constant |
[編集] 標準ライブラリ
CharTraits は、以下の標準ライブラリクラステンプレートでテンプレート型パラメータとして要求されます。
文字列 | |
| 文字のシーケンスを格納し操作する (クラステンプレート) | |
| (C++17) |
読み取り専用の文字列ビュー (class template) |
ストリーム | |
| 任意のストリームバッファを管理する (クラステンプレート) | |
| 与えられた抽象デバイス(std::basic_streambuf)をラップし 高水準な入力インターフェースを提供する (クラステンプレート) | |
| 高レベルなファイルストリーム入力操作を実装する (クラステンプレート) | |
| 高レベルな文字列ストリーム入力操作を実装する (クラステンプレート) | |
| (C++23) |
固定長文字バッファ入力操作を実装する (クラステンプレート) |
| 与えられた抽象デバイス(std::basic_streambuf)をラップし 高水準な出力インターフェースを提供する (クラステンプレート) | |
| 高レベルなファイルストリーム出力操作を実装する (クラステンプレート) | |
| 高レベルな文字列ストリーム出力操作を実装する (クラステンプレート) | |
| (C++20) |
同期出力ストリームラッパー (クラステンプレート) |
| (C++23) |
固定長文字バッファ出力操作を実装する (クラステンプレート) |
| 与えられた抽象デバイス(std::basic_streambuf)をラップし 高レベルな入出力インターフェースを提供する (クラステンプレート) | |
| 高レベルなファイルストリーム入出力操作を実装する (クラステンプレート) | |
| 高レベルな文字列ストリーム入出力操作を実装する (クラステンプレート) | |
| (C++23) |
固定長文字バッファ入出力操作を実装する (クラステンプレート) |
ストリームイテレータ | |
| std::basic_istream から読み取る入力イテレータ (クラステンプレート) | |
| std::basic_ostream に書き込む出力イテレータ (クラステンプレート) | |
ストリームバッファ | |
| 生のデバイスを抽象化する (クラステンプレート) | |
| 生のファイルデバイスを実装する (クラステンプレート) | |
| 生の文字列デバイスを実装する (クラステンプレート) | |
| (C++20) |
同期出力デバイスラッパー (クラステンプレート) |
| (C++23) |
生の固定長文字バッファデバイスを実装する (クラステンプレート) |
ストリームバッファイテレータ | |
| std::basic_streambuf から読み取る入力イテレータ (クラステンプレート) | |
| std::basic_streambuf に書き込む出力イテレータ (クラステンプレート) | |
CharTraits は、以下の標準ライブラリの std::char_traits の明示的な特殊化によって満たされます。
| template<> class char_traits<char>; template<> class char_traits<wchar_t>; |
(C++20以降) (C++11以降) (C++11以降) |
|
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 335 | C++98 | 二項演算子の要件assign は右辺値への代入を許可していませんでした。 |
その第一引数 は左辺値のみにできます。 |
| LWG 352 | C++98 | X::state_type はただCopyConstructible であることのみが要求されていました。 |
それはまた CopyAssignable および DefaultConstructible であることも要求されます。 |
| LWG 3085 | C++98 | X::copy(s, p, n) は p のみ必要とし、 範囲 [s, s + n) は不要であり、これは弱すぎます[1]。 |
前提条件: 範囲 [p, p + n) および範囲 [s, s + n) は重ならないこと。 |
- ↑
[p,p + n)と[s,s + n)は重なる可能性があります。std::memcpy を使用してX::copyを実装すると、この場合に未定義の動作が発生します。