2010-10-21 94 views
0

經過一些試驗和很多錯誤之後,我發現它對模板運算符不是很有用。作爲一個例子:關於C++模板和運算符

class TemplateClass 
{ 
    //Generalized template 
    template<TType> 
    TType& operator[](const std::string& key) 
    { 
    return TType; 
    } 
    //Specialized template for int 
    template<> 
    int& operator[]<int>(const std::string& key) 
    { 
    return 5; 
    } 
    //Specialized template for char 
    template<> 
    char& operator[]<char>(const std::string& key) 
    { 
    return 'a'; 
    } 
} 
int main() 
{ 
    TemplateClass test; 
    //this will not match the generalized template. 
    test["test without template will fail"]; 
    //this is not how you call an operator with template. 
    test<char>["test with template will fail"]; 
    //this works! 
    test.operator[]<int>["test will work like this"]; 
    return 0; 
} 

因此,爲了使與模板的操作是很醜陋的(除非您是入囉嗦了,真的是誰?)這就是爲什麼我一直在使用功能「」代替運營商。我的問題是爲什麼醜陋?爲什麼需要包含操作員關鍵字。我的猜測是,它與轉換運算符的一些後端魔術不使用括號來進行參數有關,是否有解決方法?提前致謝。

+4

試驗和錯誤,哦,你可以保存的時間,你讀過一本書... – JoshD 2010-10-21 17:20:18

+0

請注意,如果運算符采用模板參數類型的參數(如模板 int&operator [](const T&key )然後編譯器可以從你傳遞的參數中推導出模板參數 – 2010-10-21 17:21:56

+0

我的問題是WTF?你爲什麼要嘗試這樣做?專業化是應該避免的(如果可以的話)和模板化操作符應該只用於編譯器可以通過模板參數推導規則計算出模板參數,對於C++模板相關書籍,我可以推薦「C++模板 - 完整指南」 – sellibitze 2010-10-21 17:23:56

回答

2

這不是特別的模板問題。這是一個語法問題。你在做什麼很奇怪,因爲你只是改變返回類型。如果您更改了運算符參數,則不必爲模板明確提供類型。由於您確實需要提供類型,因此您需要顯式調用運算符來應用參數,因爲這是唯一的方法。

查看grammar瞭解完整的詳細信息。

+0

這。區分'<>'模板參數與比較運算符的語法很粗糙。 – 2010-10-21 17:28:25

+0

我只能想象這是一種虐待行爲。 – JoshD 2010-10-21 17:31:25

+0

你是對的,這只是一個練習, ,我確實去尋找一些答案,然後把 代碼鍵盤。該項目是一個像 系統目錄;給定一個字符串路徑和數據, 在內存中創建路徑並存儲數據。我的 方法是讓一個類持有兩棵樹, 一個用於給定級別的數據,另一個用於 目錄比當前目錄更深。 一個簡單的遞歸練習。我可以很容易地有 函數「getData」和「getDir」,但是因爲這個 是一個練習,我覺得試圖讓 更精細些。 哦。 :? – 2010-10-21 18:32:31

1

返回類型不能用於重載分辨率。你的operator []聲明簽名的唯一區別在於它們的返回類型,因此只要你有兩個聲明,編譯器就沒有希望明確你的調用test["test without template will fail"];

0

是的,模板參數演繹不起作用函數返回類型很簡單。但是模板運算符重載是非常有用的,並且可以以一些完全巨大的方式應用。

下面有一個代碼示例從boost::phoenix

for_each(c.begin(), c.end(), 
    if_(arg1 % 2 == 1) 
    [ 
     cout << arg1 << ' ' 
    ] 
); 

正如你可能知道這是一個打印容器中所有奇怪元素的簡單方法。有點神奇。