名前空間
変種
操作

std::char_traits

提供: cppreference.com
< cpp‎ | string
ヘッダ <string> で定義
template<

    class CharT

> class char_traits;

char_traits クラスは指定された文字型のための基本文字および文字列操作を抽象化する特性クラステンプレートです。 定義された操作の集合はそれによって汎用のアルゴリズムをほとんど常に実装できるようなものです。 そのため、カスタマイズされた char_traits クラスを提供するだけで、ほとんどあらゆる可能な文字または文字列型でそのようなアルゴリズムを使用することができます。

char_traits クラステンプレートは明示的な実体化のための基礎として提供されます。 ユーザは任意のカスタム文字型に対して特殊化を提供することができます。 標準の文字型に対していくつかの特殊化が定義されます。

特性の操作が例外を投げる場合、動作は未定義です。

メンバ typedef の値は以下の通りです。

特殊化 char_type int_type off_type pos_type state_type
char_traits<char> char int std::streamoff std::streampos std::mbstate_t
char_traits<wchar_t> wchar_t std::wint_t std::streamoff std::wstreampos std::mbstate_t
char_traits<char16_t> (C++11) char16_t std::uint_least16_t std::streamoff std::u16streampos std::mbstate_t
char_traits<char32_t> (C++11) char32_t std::uint_least32_t std::streamoff std::u32streampos std::mbstate_t

メンバ関数のセマンティクスは以下のように定義されます。

特殊化 assign eq lt eof
char_traits<char> = == (unsigned char に対して) < (unsigned char に対して) EOF
char_traits<wchar_t> = == < WEOF
char_traits<char16_t> (C++11) = == < 無効な UTF-16 コード単位
char_traits<char32_t> (C++11) = == < 無効な UTF-32 コード単位

char_traits クラステンプレートは CharTraits の要件を満たします。

目次

[編集] メンバ型

定義
char_type CharT
int_type char_type のすべての値および EOF を保持できる整数型
off_type 処理系定義
pos_type 処理系定義
state_type 処理系定義

[編集] メンバ関数

[static]
文字を代入します
(パブリック静的メンバ関数) [edit]
[static]
2つの文字を比較します
(パブリック静的メンバ関数) [edit]
[static]
ある文字シーケンスを別の文字シーケンスに移動します
(パブリック静的メンバ関数) [edit]
[static]
文字シーケンスをコピーします
(パブリック静的メンバ関数) [edit]
[static]
2つの文字シーケンスを辞書的に比較します
(パブリック静的メンバ関数) [edit]
[static]
文字シーケンスの長さを返します
(パブリック静的メンバ関数) [edit]
[static]
文字シーケンス内の文字を探します
(パブリック静的メンバ関数) [edit]
int_type を同等な char_type に変換します
(パブリック静的メンバ関数) [edit]
[static]
char_type を同等な int_type に変換します
(パブリック静的メンバ関数) [edit]
[static]
2つの int_type 値を比較します
(パブリック静的メンバ関数) [edit]
[static]
eof 値を返します
(パブリック静的メンバ関数) [edit]
[static]
文字が eof 値かどうか調べます
(パブリック静的メンバ関数) [edit]

[編集]

ユーザ定義の文字特性は大文字小文字を区別しない比較を提供するために使用することができます。

#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

[編集] 関連項目

文字の並びを格納および操作します
(クラステンプレート) [edit]