2017-04-13 30 views
0

美好的一天,C++只在模板類型爲字符串時才執行到大寫轉換

我正在使用模板編寫一個簡單的C++鏈接列表。我已經得到了一切工作,但我希望通過將所有字符轉換爲小寫字母來區分大小寫,以便在模板類型爲字符串時增加功能。

所以,我寫了下面的代碼片段來處理任何內容,將其轉換爲全部小寫:

 #define TEMPLATE string // changing this changes the template type in the rest of the program 
     Stack <TEMPLATE> s; //not used in this example, but just to show that I have an actual template for a class declared at some point, not just a definition called TEMPLATE 
     TEMPLATE word; // User inputs a word that is the same type of the Linked List Stack to compare if it is in the Stack. 
     cin >> word; // just showing that user defines word 
     for (unsigned int i = 0; i < word.length(); i++) 
     { 
      if (word.at(i) >= 'A' && word.at(i) <= 'Z') 
       word.at(i) += 'a' - 'A'; 
     } 

的問題是,當我的堆棧的模板,然後比較字堆棧不是字符串類型,那麼它顯然會拋出錯誤消息,因爲for循環是專門爲了查看字符串而編寫的。

那麼,有沒有辦法讓這個函數更通用,以便任何類型都可以通過? (我不這麼認爲,因爲沒有錯誤檢查整數,等等字符串是唯一依靠這個)

或者,有沒有辦法,我只能執行上面的代碼,當我我的堆棧和比較變量的模板是字符串類型?

我看着異常處理,除非我非常習慣Python如何工作,所以我無法弄清楚如何用C++實現。

正如一個側面說明,我沒有使用任何內置的函數來將字符串轉換爲所有小寫,所以這不是一個選項,我不在尋找這些建議。

+0

宏是不是你用C做模板++。我的意思是,甚至有一個'template'關鍵字......解決方案是模板專門化,但是你需要使用真正的C++模板而不是宏hackery。 – StoryTeller

+0

我不確定這段代碼是否讓你感到困惑,或者如果我仍然做錯了什麼。我的堆棧類被設計爲一個模板。我可以簡單地寫成Stack s;和字符串詞,但我想這樣做,使這兩個變量類型一起改變。如果有一個合適的方法來做到這一點,那麼如果你能指出我正確的方向,我會很感激。雖然我沒有看到這方面的任何內容,但這就是爲什麼我沒有做到這一點。謝謝。 –

+0

我對任何事情都不感到困惑。這不是關於你的類模板,而是關於你的函數模板的破解。 – StoryTeller

回答

4

創建重載一定要規範你的數據:

std::string normalize(const std::string& s) { 
    std::string res(s); 
    for (auto& c : res) { 
     c = std::tolower(c); 
    } 
    return res; 
} 

template <typename T> 
const T& normalize(const T& t) { return t; } 
+0

缺少'return res;' –

+0

@JosephIreland:修正,謝謝。 – Jarod42