在將萃取機制之前,先要說明模板特化
當有兩個模板類,乙個是通用泛型模板,乙個是特殊型別模板,如果建立乙個特殊型別的物件,會優先呼叫特殊的型別模板類,例如:
template //泛型模板
class myclass
~myclass() };
template<>
class myclass//全特化模板
~myclass() };
int main()
執行結果:
t myclass!
int myclass!
~int myclass!
~t myclass!
現在舉一系列例子來說明萃取機制
現在有兩個類,需要完成相同的功能getsum返回求和值
//int型別
class intarray
}~intarray()
int getsum(int times) //對整數求和
private:
int *a;
};//float型別
class floatarray
}~floatarray()
float getsum(float times) //對浮點數求和
private:
float* f;
};
我們可以看到,這樣寫**冗餘度很高,一部分功能比如getsum函式,兩個類都有,能不能用乙個類完成?
先定義乙個類,通過泛型,呼叫對應物件的getsum函式得到結果。
};這種方法不能完全解決我們的問題(函式返回值和引數型別固定,就會導致異常),如何解決變化的輸入輸出引數?traits技術就能解決問題。
template//可以什麼都不用寫,說明定義了乙個模板類
class numtraits
{};//模板特化intarray
template<>
class numtraits;
//模板特化floatarray
template<>
class numtraits;
};int main()
; //可以什麼都不用寫,說明定義了乙個模板類
template<> //模板特化
class numtraits;
template<> //模板特化
class numtraits;
};
萃取機制在stl中被廣泛運用,借助模板特化和和typedef可以將介面做到通用,降低了**的冗餘度,提高了**的復用 談談c 中的萃取機制 traits
template struct iterator traits 剛貼上來的是 g 2.9中關於 iterator traits 的 source code。我們知道,iterator 是建立在 container 和 algorithm 間的橋梁,成為 container 和 algorithm 互...
《STL原始碼剖析》traits技法分析
在完成乙個迭代器的時候,我們可能會暴露太多的細節在外面,為了將這些細節給隱藏,我們需要封裝,這也是為什麼每一種stl容器都提供了一種專屬的迭代器。為了解決以 迭代器所指物件的型別 為型別 解決辦法是 利用template的引數推導 argument deducation template void ...
泛型程式設計 萃取traits 偏特化 特化
提供另乙份template定義式,其本身仍為templatized 針對任何template引數更進一步限制所設計出來的特化版本 template class c 偏特化可以是 template class c,v template class c int,long 有了這項利器,我們可以解決很多原...