STL 萃取 Traits 機制剖析

2022-07-03 14:42:11 字數 1329 閱讀 7103

在將萃取機制之前,先要說明模板特化

當有兩個模板類,乙個是通用泛型模板,乙個是特殊型別模板,如果建立乙個特殊型別的物件,會優先呼叫特殊的型別模板類,例如:

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 有了這項利器,我們可以解決很多原...