特性(traits):對於某種可能會出錯的返回值型別(return type),利用類模版進行部分特例化。其思想類似設計模式。
我們只能部分特例化類模板,而不能部分特例化函式模版。——《c++ primer(5th)》 p628
part 1. 實現 sigma 函式
功能:將一段範圍內的元素求累加和。
1. 錯誤的**例項:
template t sigma(t* start, t*end)
1.1 錯誤原因:
如果傳入 char 型別範圍(迭代器)「a b c」,理論上計算結果應該返回 294 ,也就是 0x0126 ,儲存需要兩個位元組。但是 char 只有乙個位元組大小,所以會造成溢位。
實際輸出結果為 38 ——也就是溢位之後的值。
2.正確的**,採用偏特化,針對不同的型別寫出不同的對策——本例中「對策」是宣告不同的內建型別來儲存返回值型別。
template classsigmatraits {};
template
<>
class sigmatraits //
針對char型的對策
;template
<>
class sigmatraits //
針對int型的對策
;template
typename sigmatraits
::returntype sigma(t* start, t*end)
return
total;
}
3. 呼叫 sigma 函式的方法方式都是一樣的。
3.1 char範圍的呼叫例項:
char str = "abc"
;cout
<< sigma(str, str + 3) << endl;
3.2 int範圍的呼叫例項:
int arr = ;cout
<< sigma(arr, arr+3) << endl;
4. 總結
理解 traits 更像像是一種設計模式,類似於工廠方法:針對不同的型別,有不同的對策。
模版類 sigmatraits 叫做 traits template,它含有其引數型別 t 的乙個特性(trait),即 returntype。
泛型程式設計之泛型引數
問題 用c 語言實現求乙個數的平方。分析 乙個數,可以是int double complex等,規則求數的平方 x x 偽 sqrt x return x x 實現一 提供一組用於求不同數字型別的平方函式。int sqrtint int x int sqrtdouble double x 實現二 上...
泛型程式設計之2
題 解釋一下什麼是泛型程式設計,泛型程式設計和c 及stl的關係是什麼?並且,你是怎麼在c 環境裡進行泛型程式設計的?美國某著名cpu生產公司面試題 答案 泛型程式設計是一種基於發現高效率演算法的最抽象表示的程式設計方法。也就是說,以演算法為起點並尋找能使其工作且有效率工作的最一般的必要條件集。令人...
泛型程式設計 萃取traits 偏特化 特化
提供另乙份template定義式,其本身仍為templatized 針對任何template引數更進一步限制所設計出來的特化版本 template class c 偏特化可以是 template class c,v template class c int,long 有了這項利器,我們可以解決很多原...