2009-04-28 90 views
4

我是C++模板的新手,並且發現很難理解和調試它們。做這兩件事有什麼好的資源?C++模板的資源

+0

他們很簡單。給我們一個你不明白的代碼,我們會試着弄清楚它們。 – User 2009-04-28 12:14:50

+0

你能更具體嗎?你需要了解他們什麼,以及你不瞭解什麼? – jalf 2009-04-28 12:18:46

+0

你有什麼材料閱讀和理解?有很多很好的書籍和在線文本解釋模板。 – 2009-04-28 12:19:54

回答

1

模板只是一種減少開發類時需要編寫的代碼量的方法。

例如,STL向量

std::vector<int> intList; 
std::vector<float> floatList; 

這將導致編譯器實際上使場景,類似於如果您複製並粘貼代碼,但替換所有引用與浮動爲int落後兩班。

如果沒有模板,您需要爲每個要處理的類型創建一個矢量類。類有更復雜的用途,但這是最容易使用的,可以理解爲&。

編譯完成後,兩組代碼vector<int>vector<float>是完全分開的,但IDE在調試時會遍歷模板類。

0

他們在那裏讓您根據需要進行擴展和修改。請記住,這是一個模板,而不是解決方案。

HTH

4

Alexandrescu是模板的嚮導。他有很多寫作(其中許多可以在他的網站和其他網站上免費獲得)以及一些書籍。

提升DocumentationBoost Cookbook是一個很好的網站,一旦你對模板感到滿意並且覺得自己像畢業後能夠升級一樣。

1

我有兩個快速提示,可以在未來爲您節省一些問題。

模板必須定義和接頭連接器實現的,因爲他們被翻譯/在編譯時

創建如果你有下面的代碼:

// Foo.h 
template <typename T> 
class Foo 
{ 
    ... 
}; 

// Bar.cpp 
#include "Foo.h" 
void func() 
{ 
    Foo<int> fooInt; 
    Foo<double> fooDouble; 
} 

當處理Bar.cpp文件,編譯器將創建一個Foo類的新定義,其中每個T都替換爲fooInt實例的int類型,並且每個T的一個新定義與每個T替換爲fooDouble實例的雙重類型。

簡而言之,C++不支持模板類,編譯器模擬它們在編譯時替換類型並創建普通類。所以,fooInt和fooDouble的編譯類型是不同的。

因爲它們是在編譯時翻譯的,並且不是單獨編譯的,所以它們必須在頭文件中定義和實現必須

如果將模板類作爲普通類(頭文件和源文件)實現,編譯器(實際上是鏈接器)拋出的錯誤是沒有實現方法(這是因爲源文件被忽略)。

仍然可以創建前置聲明,以避免循環依賴

這只是你要轉發聲明它們是這樣的:

template <typename T> 
class Foo; 

而且,與正常的正向聲明,你必須請確保您包含所有必要的標題。

-1

這是瞭解℃的非常好,幾乎簡練的文章++模板
http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part

我會在這裏把基本部分:

1.功能模板:

簡單的功能模板:

template<class TYPE> 
void PrintTwice(TYPE data) 
{ 
    cout<<"Twice: " << data * 2 << endl; 
} 

注意「TYPE」可以是任何其他有效的名字。

您應該更好地使用反映類型參數含義的名稱,並且該名稱可以提高代碼的可讀性。

現在你可以這樣調用:

PrintTwice(5.5);//TYPE is 'float' 
PrintTwice(5);//TYPE is 'int' 

可以強制編譯器實例化功能類型傳遞明確:

PrintTwice<double>(5); 

,如果你不及格任何類型的編譯器都會確定類型是什麼。

你可以有多個參數模板和(可選)返回類型相同類型:

template<class T> 
T Add(T n1, T n2) 
{ 
    return n1 + n2; 
} 

但請注意,你不能例如通過在intn2n1雙!兩個參數應該是相同的類型,並且返回類型也是該類型的。

如果你想有可能是不同的類型參數的模板函數:

template<class T1, class T2> 
double Add(T1 t1Data, T2 t2Data) 
{ 
    return t1Data + t2Data; 
} 

,並用它喜歡:

cout<<Add(5,7.0);//T1=int T2=double 
cout<<Add(5.5,7);//T1=double T2=int 
cout<<Add<double,double>(5,7);//T1=double T2=double by passing types explicitly 

當函數模板採用模板式,而不是從它的函數參數如:

template<class T> 
void PrintSize() 
{ 
    cout << "Size of this type:" << sizeof(T); 
} 

您不能簡單地調用這樣的函數模板:

PrintSize(); 

由於此函數模板需要模板類型參數說明,並且它不能由編譯器自動推導出來。正確的調用是:

PrintSize<float>(); 

2.class模板:

定義幾乎是相似的:

template<class T> 
class Item 
{ 
    T Data; 
public: 
    Item() : Data(T()) 
    {} 

    void SetData(T nValue) 
    { 
     Data = nValue; 
    } 

    T GetData() const 
    { 
     return Data; 
    } 

    void PrintData() 
    { 
     cout << Data; 
    } 
}; 

,但使用它時,你應該明確地指定類型:

Item<int> item1; 

棘手的部分是,你不能imp字元素聲明在頭文件,並在一個或多個源文件相應的執行(請參考文章,看看爲什麼)

類模板也讓一些非類型模板參數:

template<class T, int SIZE> 
class Array 
{ 
static const int Elements_2x = SIZE * 2; 
void DoSomething(int arg = SIZE); 
// Non-const can also appear as default-argument... 
private: 
    T TheArray[SIZE]; 
}; 

有還有很多其他的部分和更多的解釋,我不能帶到這裏。

我建議你花幾個小時閱讀那篇文章和那篇文章的第二部分。即使你認爲你知道模板在C++中的工作方式。

+1

這可能在理論上回答這個問題,但最好將答案的基本部分包括在內以供將來的用戶使用並提供鏈接供參考。 [link-dominated answers](// meta.stackexchange.com/questions/8231)可能通過[link rot](// en.wikipedia.org/wiki/Link_rot)失效。 – Mogsdad 2016-02-25 18:50:08

+1

最好不要回答離題問題,例如請求離線資源。 – TylerH 2016-02-25 18:51:08