2012-08-19 96 views

回答

3

這是因爲字符特徵是生成標準類變體(如字符串)的一種方式,並且原始類型的操作符可能實際上並不是您想要的。

例如,考慮存儲不區分大小寫的字符串的類;您可能會以存儲大寫字母及其小寫版本的相同內容的方式實施assign()。 (就此而言,其他性格特徵操作(如平等)也必須被忽略。)

+1

有趣......但不是那個'比較'是爲了什麼? – Mehrdad 2012-08-19 05:10:36

+1

我認爲重寫'compare()'是處理不區分大小寫的更好方法;有可能是更好的例子。我唯一的觀點是角色特徵的一個子類可以做任何想做的事情,一個類可能想做「更多」而不是簡單地複製一個角色的確切值(作爲操作員)是可行的。 – 2012-08-19 05:20:19

7

實際上,每次使用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; 
} 
+1

如果你能解釋爲什麼這很有用,而不僅僅是找到一種方法來使用它,這將是一個更好的答案。 :) – Mehrdad 2012-08-20 03:00:50

+0

好吧,假設我們想要一個字符串類型'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