void assign(char_type& to, char_type from);
this functionの代わりに代入演算子を使用できないのはなぜですか?これは何のために使われますか?std :: char_traits :: assign()の目的は何ですか?
void assign(char_type& to, char_type from);
this functionの代わりに代入演算子を使用できないのはなぜですか?これは何のために使われますか?std :: char_traits :: assign()の目的は何ですか?
これは、文字特性は標準クラス(文字列など)のバリアントを生成する方法であり、プリミティブ型の演算子は実際にはあなたが望むものではない可能性があるからです。
たとえば、大文字と小文字を区別しない文字列を格納するクラスを考えてみましょう。 assign()
を、大文字と小文字の両方のバージョンで同じものを格納する方法で実装することができます。 (その点については、等号などの他の文字特性操作もオーバーライドする必要があります)。
実際にはstd :: string :)を使用するたびにこの関数を使用します。
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
(thisを参照してください):のstd :: stringは、実際のように定義されてのstd ::のbasic_string、のtypedefです。特性テンプレートパラメータに特に注意してください。このような傾向がある場合は、Traitsテンプレートパラメータを使用して、文字列クラスの動作の特定の属性をカスタマイズできます。これらのプロパティの1つは、割り当てを行うとどうなるかです。
ここでは、この使用例を示します。割り当てを小文字に強制します。
#include <string>
#include <iostream>
#include <cctype>
struct ci_char_traits : public std::char_traits<char> {
static void assign(char& r, const char& a)
{
r = std::tolower(a);
}
static char* assign(char* p, std::size_t count, char a)
{
for (std::size_t i = 0; i < count; ++i)
{
p[i] = std::tolower(a);
}
}
};
typedef std::basic_string<char, ci_char_traits> ci_string;
std::ostream& operator<<(std::ostream& os, const ci_string& str) {
return os.write(str.data(), str.size());
}
int main()
{
ci_string s1 = "Hello";
// This will become a lower-case 'o'
s1.push_back('O');
// Will replace 'He' with lower-case 'a'
s1.replace(s1.begin(), s1.begin()+2, 1, 'A');
std::cout << s1 << std::endl;
}
単にそれを使う方法を見つけるのではなく、それがなぜ有用であるかを説明できるなら、はるかに良い答えになるでしょう。 :) – Mehrdad
まあ、すべての文字が小文字であるという不変量を保存した文字列型 'lc_string'を持っていたとします。あなたがやる最初のことはおそらく、文字列( 'lc_string str =" HELLO "')を初期化するときに 'char_traits :: copy'(と' char_trains :: move'、なぜそうではありません)小文字にしかし、文字列のユーザは常に 'replace'や' push_back() 'を使うことができるので、' char_traits :: assign'をオーバーライドしない限り、それを越えて '小文字'の不変条件を保持する方法はありません。 – nevsan
興味深いですが、「比較する」とは何ですか? – Mehrdad
'compare()'をオーバーライドすると大文字と小文字を区別しない方が良いでしょう。おそらくより良い例があります。私の唯一のポイントは、キャラクタの特性のサブクラスが望むものを何でもでき、キャラクタの正確な値を(オペレータのように)コピーするのではなく、クラスが「より多く」を実行することができることは確かに実現可能です。 –