C++的模板太有魔性了,根本就是一個編譯期語言。不過要作到好用,有用,又不產生垃圾代碼確實困難。
雖然還沒領悟到精髓,可是如下幾個用法我的感受仍是挺不錯的。c++
在Go中能夠很容易地給任意類型增長方法函數
type Integer int func (a Integer) Less(b Integer) bool { return a < b }
感受這個特性十分方便,因而用模板實現了一個相似的功能。this
class Binary: public std::vector<unsigned char> { public: template<typename T> bool convertTo(T& value) { return false; } }; template<> inline bool Binary::convertTo(String& value) { for (auto c : *this) value.push_back(c); return true; }
上面的例子中,首先定義了原始數據類型Binary
,要讀取其中的內容就須要寫一個從Binary
到特定類型的轉換函數。
利用模板特化咱們能夠將成員函數的實現放在任意位置,且不用修改原來類的定義。code
只要在泛型模板裏面寫入錯誤的代碼。ERROR不須要定義。編譯
class Binary: public std::vector<unsigned char> { public: template<typename T> bool convertTo(T& value) { //throw error ERROR("undefined convert Type"); return false; } };
這樣一來一旦有人嘗試轉換成未定義的類型,編譯的時候就會報錯。模板