ユーザー定義の型には、特性クラス、コード変換ファセット、文字分類ファセットがそれぞれに必要です。特性クラスでは、変換 state_type を定義し、さらに、型の配列のコピーや配列の比較などの演算を定義します。コード変換ファセットでは、単純な char との変換機能を提供します。ctype ファセットには、新しい型と単純 char との変換用のメソッドなどの文字分類ルーチンと操作ルーチンがあります。
次のコードは、Echar の特性クラス宣言を示したものです。
struct Etraits { typedef Echar char_type; typedef long int_type; typedef long off_type; typedef mbstate_t state_type; typedef fpos<state_type> pos_type; static void assign (char_type& c1, const char_type& c2); static bool eq(const char_type& c1,const char_type& c2); static bool lt (const char_type& c1, const char_type& c2); static int compare (const char_type* s1, const char_type* s2, size_t n); static size_t length(const char_type *s); static const char_type* find (const char_type* s, int n, const char_type& a); static char_type* move (char_type* s1, const char_type* s2, size_t n); static char_type* copy(char_type *dst,const char_type *src, size_t n); static char_type* assign (char_type* s, size_t n, const char_type& a); static int_type not_eof(const int_type& c); static char_type to_char_type(const int_type& c); static int_type to_int_type(const char_type& c); static bool eq_int_type(const int_type& c1,const int_type& c2); static state_type get_state(pos_type pos); static int_type eof(); };
特性クラスのメンバー関数の詳細については、『標準 C++ クラスライブラリ・リファレンス 』の char_traits の節を参照してください。
新しいコード変換ファセットを作成するには、codecvt テンプレートから情報を継承し、すべての限定公開の仮想関数に実装を提供します。codecvt に定義された公開インタフェースを通じて、入出力ストリームは限定公開の関数を呼び出します。また、単一の size_t 引数を使用して、その引数で codecvt を初期化するコンストラクタも用意する必要があります。
Echar 用のコード変換ファセットには、次のような宣言部があります。
class Ecodecvt : public codecvt<Echar,char,Estate> { public: _EXPLICIT Ecodecvt (size_t refs = 0) : codecvt<Echar,char,Estate>(refs) {;} protected: virtual ~Ecodecvt() {;} virtual result do_out(Estate& state, const Echar* from, const Echar* from_end, const Echar*& from_next, char* to, char* to_limit, char*& to_next) const; virtual result do_in(Estate& state, const char* from, const char* from_end, const char*& from_next, Echar* to, Echar* to_limit, Echar*& to_next) const; virtual result do_unshift(Estate& state, char* to, char* to_limit, char*& to_next) const; virtual int do_encoding() const throw(); virtual bool do_always_noconv() const throw(); virtual int do_length(const Estate&, const char* from, const char* end, size_t maxm) const; virtual int do_max_length() const throw(); };
コード変換ファセットの定義の詳細については、第 19 章を参照してください。メンバー関数の示唆については、『標準 C++ クラスライブラリ・リファレンス 』の codecvt の節を参照してください。
文字分類ファセットを作成するには、ctype テンプレートから情報を継承し、すべての限定公開の仮想関数に実装を提供します。また、単一の size_t 引数を使用して、その引数で ctype を初期化するコンストラクタも用意する必要があります。
widen 関数では、単純 char からユーザー定義の文字型への変換を定義します。narrow 関数には、ユーザー定義型から単純 char への変換機能があります。
Echar の文字分類ファセットには次のような宣言部があります。
class Ectype : public ctype<Echar> { public: typedef Echar char_type; _EXPLICIT Ectype (size_t refs = 0) : ctype<Echar>(refs) {;} // refs を ctype コンストラクタに // 必ず渡す必要がある protected: inline virtual ~Ectype (); virtual bool do_is(mask m, Echar c) const; virtual const Echar* do_is( const Echar* low, const Echar* high, mask* vec) const; virtual const Echar* do_scan_is( mask m, const Echar* low, const Echar* high) const; virtual const Echar* do_scan_not( mask m, const Echar* low, const Echar* high) const; virtual Echar do_toupper(Echar e) const; virtual const Echar* do_toupper(Echar* low, const Echar* high) const; virtual Echar do_tolower(Echar) const; virtual const Echar* do_tolower(Echar* low, const Echar* high) const; virtual Echar do_widen(char) const; virtual const char* do_widen(const char* lo, const char* hi, Echar* dest) const; virtual char do_narrow(Echar, char dfault) const; virtual const Echar* do_narrow(const Echar* lo, const Echar* hi,char dfault, char* dest) const; };
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月