template <typename T> class A; template<> class A<int> { }; int main() { A<int> a; A<double> b; //error return 0; }
以上代碼,通用的模版沒有實現,只實現了int的特化模版,這樣class A就只接受int類型的模版形參了。 ios
同理,咱們也能實現讓指定類型如int不能編譯過,其餘都能編譯過,代碼以下: 程序員
template <typename T> class A {}; template<> class A<int>; int main() { A<int> a; //error A<double> b; return 0; }
#include<iostream> using namespace std; template< typename T> int func(T a, T b) { cout << a + b << endl; return a + b; } int main() { func<int>(3, 4); func(3, 4); return 0; }
func<int>(3, 4);和func(3, 4);調用是等價的。 函數
關於函數模版能夠推導,這裏有一個有趣的問題: spa
若是要實現一個類型轉化的模版,以下兩種定義,那種比較好? code
template<typename Dst, typename Src> Dst convert(Src src) template<typename Src, typename Dst> Dst convert(Src src)
這兩種定義的差異主要在於模版形參,從直覺上看,從src轉化到dst,可能第二種定義更符合咱們的邏輯,可是第一種定義,更能方便函數模版的調用者—— i = Convert<int>(7.04); ,不須要像這樣寫完整的模版形參—— i = Convert<int, double>(7.04); ,儘管他們是等價的。 開發
這個例子告訴我,對待別人要寬——讓用戶更方便的使用。 io
寫到這裏,又想起一個例子,跟C++模版不要緊: 編譯
咱們做爲開發,在一個類中實現"<"的重載時,也要實現">"和「==」的重載,由於調用者會以爲,既然有了"<"操做,那麼「==」和「>」天然也有。 class
然而,咱們做爲一個類的使用者時,儘量少使用重載方法,採用一個"<"就能知足比較操做。這樣,即便程序員沒有實現全部比較符號的重載,個人代碼也能正常運行。 stream
這又是一個對本身要嚴格,對別人要寬泛的例子。