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時都使用此函數:)。的std :: string實際上是標準:: basic_string的,其被定義爲一個typedef:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
(見this)。特別注意Traits模板參數。如果您非常喜歡,Traits模板參數允許您自定義字符串類行爲的某些屬性。其中一個屬性是當你做任務時會發生什麼。
這是一個示例用法。它會強制分配爲小寫。
#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 2012-08-20 03:00:50
好吧,假設我們想要一個字符串類型'lc_string'來保存所有字符都是小寫的不變量。你要做的第一件事可能是覆蓋'char_traits :: copy'(和'char_trains :: move',爲什麼不),這樣當你初始化字符串('lc_string str =「HELLO」')時,它會將它轉換以小寫字母表示。然而,除非你也重寫'char_traits :: assign',否則沒有辦法保存'小寫'不變量,因爲字符串的用戶總是可以使用'replace'或'push_back()'。 – nevsan 2012-08-21 15:10:13
有趣......但不是那個'比較'是爲了什麼? – Mehrdad 2012-08-19 05:10:36
我認爲重寫'compare()'是處理不區分大小寫的更好方法;有可能是更好的例子。我唯一的觀點是角色特徵的一個子類可以做任何想做的事情,一個類可能想做「更多」而不是簡單地複製一個角色的確切值(作爲操作員)是可行的。 – 2012-08-19 05:20:19