1. 程式人生 > >c++::關於型別萃取

c++::關於型別萃取

吐舌頭聽到型別萃取這個名字,很多人肯定都感覺好高大上啊,會不會很難,是個什麼東西呢?彆著急,聽我娓娓道來。

【型別萃取】說白了就是對模板特化的一種應用。

1、型別萃取的作用:型別萃取使用模板技術來萃取型別(包含自定義型別和內建型別)的某些特性,用以判斷該型別是否含有某些特性,從而在泛型演算法中來對該型別進行特殊的處理用來提高效率或者其他。

我們來看一道讀型別萃取應用的題:如果我們要編寫一道通用加法的函式,但是它的返回值和引數的型別不同,也就是說,它的返回值和引數我們可以進行分開控制。來看我們怎麼做:(這個例子是實現返回值返回的是提升一個型別)

#include<iostream>
using namespace std;
template<typename T>
struct ElemType;
template<>
struct ElemType<int>
{
	typedef long Type;
	//int Type;
};
template<>
struct ElemType<unsigned char> //我們本可以用char的但是編譯器一般會將char預設為有符號還是無符號,我們未可知,
{
	typedef short Type;    //為了方便檢查,我們用unsigned char
};
template<typename T>
 typename ElemType<T>::Type Add(T a,T b)
{
	typename ElemType<T>::Type hhh;
	cout<<typeid(hhh).name()<<endl;
	return a+b;
}
 int main()
 {
	//cout<<Add((unsigned char)255,(unsigned char)255)<<endl;  
	 Add((unsigned char)255,(unsigned char)255);
	 return 0;
 }

執行結果:


【分析說明】:

1)在 typename ElemType<T>::Type Add(T a,T b)
  這句裡使用typename 的原因是用於區分上面

template<>
struct ElemType<int>
{
	typedef long Type;
	//int Type;
};
這段程式碼裡的Type.

2)我們有兩種方式檢查輸出:

A、在主函式裡

//cout<<Add((unsigned char)255,(unsigned char)255)<<endl; 
B、利用typeid
typename ElemType<T>::Type hhh;
	cout<<typeid(hhh).name()<<endl;

這就是型別萃取的一個應用,是不是茅塞頓開!!!

更多它的應用,待以後我慢慢道來。。吐舌頭