名前空間
変種
操作

C++ 名前付き要件: CharTraits

From cppreference.com
 
 
C++ 名前付き要件
 

CharTraits は、指定された文字型に対する基本的な文字および文字列操作を抽象化するトレイトクラスです。ほとんどの標準ライブラリの文字列クラスや入出力クラスは、対応する文字テンプレート型パラメータとともに CharTraits テンプレート型パラメータを必要とします。

目次

[編集] 要件

CharTraits に対して以下にリストされている操作はいずれも例外を投げないものとします。

以下を考えます。

  • CharT、文字型
  • X、型 CharT に対する CharTraits
  • cd、型 CharT の値
  • pq、型 const CharT* の値
  • s、型 CharT* の値
  • nij、型 std::size_t の値
  • ef、型 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::pos_type(X::off_type(-1)) を使用します。
  • この無効な値を、この型の値を受け取る std::istreamstd::ostream、または std::streambuf のメンバの引数として使用することは未定義の動作です。
  • X が入出力クラスでトレイトテンプレートパラメータとして使用されている場合、この型が std::streampos でない場合は実装定義の動作を呼び出します。
X::state_type  DestructibleCopyAssignableCopyConstructibleDefaultConstructible

[編集]

Expression 戻り値の型 セマンティクス  計算量 
X::eq(c, d) bool 戻り値: cd と等しいとみなされるかどうか Constant
X::lt(c, d) bool 戻り値: cd より小さいとみなされるかどうか Constant
X::compare(p, q, n) int 戻り値
  • 0、もし [0n) の各 i について、X::eq(p[i], q[i])true である場合
  • それ以外の場合、負の値、もし
    • [0n) のある j について、X::lt(p[j], q[j])true であり、かつ
    • [0j) の各 i について、X::eq(p[i], q[i])true である場合
  • それ以外の場合、正の値
線形
X::length(p) std::size_t 戻り値: X::eq(p[i], CharT())true となる最小の i 線形
X::find(p, n, c) const X::char_type* 戻り値
  • p から p + n の範囲 [pp + n) 内の最小の q で、X::eq(*q, c)true となるもの
  • それ以外の場合は 0
線形
X::move(s, p, n) X::char_type*
  • [0n) の各 i について、X::assign(s[i], p[i]) を実行します。
  • 範囲 [pp + n)[ss + n) が重なる場合でも、正しくコピーします。
  • 戻り値: s
線形
X::copy(s, p, n) X::char_type*
  • 前提条件: 範囲 [pp + n)[ss + n) は重ならないこと。
  • 戻り値: s
  • [0n) の各 i について、X::assign(s[i], p[i]) を実行します。
線形
X::assign(r, d) (使用されません) r = d を代入します。 Constant
X::assign(s, n, c) X::char_type*
  • [0n) の各 i について、X::assign(s[i], c) を実行します。
  • 戻り値: s
線形
X::not_eof(e) X::int_type 戻り値
  • e、もし X::eq_int_type(e, X::eof())false の場合
  • それ以外の場合、値 f、ただし X::eq_int_type(f, X::eof())false となるもの。
Constant
X::to_char_type(e) X::char_type 戻り値
  • ある c について X::eq_int_type(e, X::to_int_type(c))true の場合、c
  • それ以外の場合、未指定の値
Constant
X::to_int_type(c) X::int_type 戻り値: ある値 eX::to_char_type および X::eq_int_type の定義によって制約されます。 Constant
X::eq_int_type(e, f) bool
  • すべての c および d について、X::eq(c, d)X::eq_int_type(X::to_int_type(c),
                   X::to_int_type(d))
    に等しい。
  • 戻り値
    • ある cd について、e == X::to_int_type(c) かつ f == X::to_int_type(d) である場合、X::eq(c, d) を返します。
    • それ以外の場合、ef が両方とも X::eof() のコピーである場合、true を返します。
    • それ以外の場合、e または f のどちらか一方が X::eof() のコピーであり、もう一方がそうでない場合、false を返します。
    • それ以外の場合、値は未指定です。
Constant
X::eof() X::int_type 戻り値: ある値 e。すべての値 c について X::eq_int_type(e, X::to_int_type(c))false である。 Constant

[編集] 標準ライブラリ

CharTraits は、以下の標準ライブラリクラステンプレートでテンプレート型パラメータとして要求されます。

文字列
文字のシーケンスを格納し操作する
(クラステンプレート) [編集]
読み取り専用の文字列ビュー
(class template) [編集]
ストリーム
任意のストリームバッファを管理する
(クラステンプレート) [編集]
与えられた抽象デバイス(std::basic_streambuf)をラップし
高水準な入力インターフェースを提供する
(クラステンプレート) [編集]
高レベルなファイルストリーム入力操作を実装する
(クラステンプレート) [編集]
高レベルな文字列ストリーム入力操作を実装する
(クラステンプレート) [編集]
固定長文字バッファ入力操作を実装する
(クラステンプレート) [編集]
与えられた抽象デバイス(std::basic_streambuf)をラップし
高水準な出力インターフェースを提供する
(クラステンプレート) [編集]
高レベルなファイルストリーム出力操作を実装する
(クラステンプレート) [編集]
高レベルな文字列ストリーム出力操作を実装する
(クラステンプレート) [編集]
同期出力ストリームラッパー
(クラステンプレート) [編集]
固定長文字バッファ出力操作を実装する
(クラステンプレート) [編集]
与えられた抽象デバイス(std::basic_streambuf)をラップし
高レベルな入出力インターフェースを提供する
(クラステンプレート) [編集]
高レベルなファイルストリーム入出力操作を実装する
(クラステンプレート) [編集]
高レベルな文字列ストリーム入出力操作を実装する
(クラステンプレート) [編集]
固定長文字バッファ入出力操作を実装する
(クラステンプレート) [編集]
ストリームイテレータ
std::basic_istream から読み取る入力イテレータ
(クラステンプレート) [編集]
std::basic_ostream に書き込む出力イテレータ
(クラステンプレート) [編集]
ストリームバッファ
生のデバイスを抽象化する
(クラステンプレート) [編集]
生のファイルデバイスを実装する
(クラステンプレート) [編集]
生の文字列デバイスを実装する
(クラステンプレート) [編集]
同期出力デバイスラッパー
(クラステンプレート) [編集]
生の固定長文字バッファデバイスを実装する
(クラステンプレート) [編集]
ストリームバッファイテレータ
std::basic_streambuf から読み取る入力イテレータ
(クラステンプレート) [編集]
std::basic_streambuf に書き込む出力イテレータ
(クラステンプレート) [編集]


CharTraits は、以下の標準ライブラリの std::char_traits の明示的な特殊化によって満たされます。

template<> class char_traits<char>;

template<> class char_traits<wchar_t>;
template<> class char_traits<char8_t>;
template<> class char_traits<char16_t>;

template<> class char_traits<char32_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 のみ必要とし、
範囲 [ss + n) は不要であり、これは弱すぎます[1]
前提条件: 範囲 [pp + n) および
範囲 [ss + n) は重ならないこと。
  1. [pp + n)[ss + n) は重なる可能性があります。std::memcpy を使用して X::copy を実装すると、この場合に未定義の動作が発生します。
English 日本語 中文(简体) 中文(繁體)