我是C++模板的新手,並且發現很難理解和調試它們。做這兩件事有什麼好的資源?C++模板的資源
C++模板的資源
回答
我推薦Vandevoorde和Josuttis出色的書C++ Templates - The Complete Guide。
模板只是一種減少開發類時需要編寫的代碼量的方法。
例如,STL向量
std::vector<int> intList;
std::vector<float> floatList;
這將導致編譯器實際上使場景,類似於如果您複製並粘貼代碼,但替換所有引用與浮動爲int落後兩班。
如果沒有模板,您需要爲每個要處理的類型創建一個矢量類。類有更復雜的用途,但這是最容易使用的,可以理解爲&。
編譯完成後,兩組代碼vector<int>
和vector<float>
是完全分開的,但IDE在調試時會遍歷模板類。
他們在那裏讓您根據需要進行擴展和修改。請記住,這是一個模板,而不是解決方案。
HTH
Alexandrescu是模板的嚮導。他有很多寫作(其中許多可以在他的網站和其他網站上免費獲得)以及一些書籍。
提升Documentation和Boost Cookbook是一個很好的網站,一旦你對模板感到滿意並且覺得自己像畢業後能夠升級一樣。
我有兩個快速提示,可以在未來爲您節省一些問題。
模板必須定義和接頭連接器實現的,因爲他們被翻譯/在編譯時
創建如果你有下面的代碼:
// 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;
而且,與正常的正向聲明,你必須請確保您包含所有必要的標題。
這是瞭解℃的非常好,幾乎簡練的文章++模板
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;
}
但請注意,你不能例如通過在int
和n2
n1
雙!兩個參數應該是相同的類型,並且返回類型也是該類型的。
如果你想有可能是不同的類型參數的模板函數:
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. RadGridView模板資源
- 2. ARM模板CONCAT資源
- 3. WP7設計模板資源
- 4. 資源不是在模板
- 5. 新的api應用程序資源的Azure資源模板
- 6. 作爲資源的android的HTML模板
- 7. 模板的春天映射資源Thymeleaf
- 8. Visual Studio的資源組項目模板
- 9. 劍道的UI調度資源模板
- 10. 沒有模板鏈接的ARM模板條件嵌套資源
- 11. 在Azure資源管理器模板中共享資源
- 12. Symfony2覆蓋包模板「資源被資源隱藏」時出錯?
- 13. RESTful URL - 基於資源模板創建資源
- 14. ARM模板 - 根據資源從資源組
- 15. C#資源與XAML資源
- 16. VelocityEngine:找不到模板資源
- 17. 導軌資源javascript模板錯誤
- 18. eclipse嘗試使用資源模板?
- 19. Drupal模板/主題資源或建議?
- 20. 廚師模板資源not_if獨奏
- 21. wpf資源模板不適用
- 22. XAML:爲ComboBoxItems創建資源或模板
- 23. BigCommerce模板 - 類別資源深度
- 24. 預定義新資源/文檔模板
- 25. 將路由模板渲染到資源模板出口
- 26. Ember.js - 呈現模板嵌套資源和模板覆蓋
- 27. 獲取從資源組標籤在Azure的資源管理器模板
- 28. 如何引用天青資源模板中的現有資源組
- 29. C#.NET資源
- 30. C++ UI資源
他們很簡單。給我們一個你不明白的代碼,我們會試着弄清楚它們。 – User 2009-04-28 12:14:50
你能更具體嗎?你需要了解他們什麼,以及你不瞭解什麼? – jalf 2009-04-28 12:18:46
你有什麼材料閱讀和理解?有很多很好的書籍和在線文本解釋模板。 – 2009-04-28 12:19:54