真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++_模板類與類型萃取技術(shù)

    在聲明變量,函數(shù),和大多數(shù)其他類型實(shí)體的時(shí)候,C++要求我們使用指定的類型。然而,有許多代碼,除了類型不同之外,其余部分看起來(lái)都是相同的,比如,下面這個(gè)例子:

創(chuàng)新互聯(lián)公司成立十載來(lái),這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、域名與空間、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開(kāi)快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)公司通過(guò)對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。

bool IsEqual (int left, int right)
{
    return left == right;
}

bool IsEqual (const string& left , const string& right)
{
    return left == right;
}

void test()
{
    string s1 ("s1"), s2("s2");
    cout<

    上面這個(gè)例子,是為了比較兩個(gè)變量是否相等的重載函數(shù)。這兩個(gè)函數(shù)功能相同,只是處理的參數(shù)類型不同,那如果你需要處理float,double,等一系列類型時(shí),你就要一一寫出這些類型的重載函數(shù),這樣代碼會(huì)顯得十分繁瑣,這時(shí),就需要使用模板函數(shù)來(lái)處理了,模板函數(shù)只需要寫一個(gè)就可以處理上面這種問(wèn)題。

template
bool IsEqual (const T& left , const T& right )
{
    return left == right;
}

void test1 ()
{
    string s1 ("s1"), s2("s2" );
    cout<

    在編譯模板函數(shù)時(shí),編譯器會(huì)根據(jù)傳入的參數(shù),自動(dòng)推演出模板形參類型,并自動(dòng)生成相應(yīng)的代碼,這樣就相對(duì)于上面使用函數(shù)重載方式,代碼量就大大減少,因?yàn)榫幾g器會(huì)幫助你推演出相應(yīng)代碼。


當(dāng)上面處理left,right類型不同時(shí),使用模板函數(shù)時(shí)就需要作如下處理:

template 
bool IsEqual (const T& left , const T& right )
{
    return left == right;
}

void test2()
{
    cout<(1,1.2)<< endl; // 顯示實(shí)例化
    cout<(1,1.2)<< endl; // 顯示實(shí)例化
}

    那么我們就知道使用模板函數(shù)就要注意模板參數(shù)的匹配問(wèn)題,你也可以使用顯示實(shí)例化方式,強(qiáng)制處理這種情況的發(fā)生。要是你就是想要比較兩種不同類型,那就需要重載函數(shù)模板,使它可以接受兩種類型,下面就是重載之后的:

bool IsEqual (const int& left , const int& right)
{
    return left == right;
}

template 
bool IsEqual (const T& left , const T& right )
{
    return left == right;
}

template 
bool IsEqual (const T1& left , const T2& right)
{
    return left == right;
}
void test3()
{
    cout<(1,1)<< endl;
    cout<

模板類

/*模板類的格式*/

template
class name
{ ... };

    以前在處理順序表時(shí),要更改其中的data類型,往往是通過(guò)修改typedef int DataType ,來(lái)修改其存放的數(shù)據(jù)類型,那么現(xiàn)在就可以使用模板類來(lái)不需要手動(dòng)去修改其類型,下面是使用模板類實(shí)現(xiàn)順序表:

#include 
#include 
using namespace std;

template 

class SeqList
{
public:
	SeqList()
		:_data(NULL)
		,_size(0)
		,_capacity(0)
	{
		CheakCapacity();
	}
	~SeqList()
	{
		if(_data != NULL)
		{
			delete[] _data;
		}
	}
public:
	void PushBack(const T& d)
	{
		CheakCapacity();
		_data[_size] = d;
		_size++;
	}
	void PushFront(const T& d)
	{
		CheakCapacity();
		int i = _size;
		for(i; i>0; i--)
		{
			_data[i] = _data[i-1];
		}
		_data[i] = d;
		_size++;
	}
	void PopBack()
	{
		if(_size == 0)
		{
			cout<<"List is empty!!"< L;
    L.PushBack(1);
    L.PushBack(2);
    L.PushBack(3);
    L.PushBack(4);
    L.PushBack(5);
    L.Display();
}

int main()
{
    test4();
    system("pause");
    return 0;
}

結(jié)果:

C++_模板類與類型萃取技術(shù)

當(dāng)測(cè)試為下面test5()時(shí):

void test5()
{
    SeqList L;
    L.PushBack("11111111111");
    L.PushBack("21111111111");
    L.PushBack("31111111111");
    L.PushBack("41111111111");
    L.PushBack("51111111111");
    L.PushBack("61111111111");
    L.Display();
}

結(jié)果:

C++_模板類與類型萃取技術(shù)

這為什么會(huì)崩潰呢?

        因?yàn)槭褂胢emcpy()時(shí):當(dāng)我們拷貝的是基本類型時(shí),只用拷貝所傳遞指針上的數(shù)據(jù),如果是string類型呢,我們則需要在堆上開(kāi)辟空間,所傳遞的指針如 果被直接復(fù)制,則有可能(vs下的string類型的實(shí)現(xiàn)原理是若字符串不長(zhǎng)則以數(shù)組保存,若字符串過(guò)長(zhǎng),則通過(guò)指針在堆上開(kāi)辟空間進(jìn)行保存)出現(xiàn)同一地 址,析構(gòu)兩次這樣的常見(jiàn)錯(cuò)誤。

那么要解決上面的問(wèn)題,就要使用c++中的類型萃取技術(shù)。

    類型萃取是一種常用的編程技巧,其目的是實(shí)現(xiàn)不同類型數(shù)據(jù)面對(duì)同一函數(shù)實(shí)現(xiàn)不同的操作,它與類封裝的區(qū)別是,我們并不用知道我 們所調(diào)用的對(duì)象是什么類型,類型萃取是編譯后知道類型,先實(shí)現(xiàn),而類的封裝則是先定義類型,后實(shí)現(xiàn)方法。在這里我們可以用模板的特化實(shí)現(xiàn)其編程思想。

再來(lái)實(shí)現(xiàn)上面的順序表:

#include 
#include 
#include 
using namespace std;

template 

class SeqList
{
public:
	SeqList()
		:_data(NULL)
		,_size(0)
		,_capacity(0)
	{
		CheakCapacity();
	}
	~SeqList()
	{
		if(_data != NULL)
		{
			delete[] _data;
		}
	}
public:
	void PushBack(const T& d)
	{
		CheakCapacity();
		_data[_size] = d;
		_size++;
	}
	void PushFront(const T& d)
	{
		CheakCapacity();
		int i = _size;
		for(i; i>0; i--)
		{
			_data[i] = _data[i-1];
		}
		_data[i] = d;
		_size++;
	}
	void PopBack()
	{
		if(_size == 0)
		{
			cout<<"List is empty!!"<pos; i--)
		{
			_data[i] = _data[i-1];
		}
		_data[pos] = d;
		_size++;
	}
	void Erase(int pos)
	{
		assert(pos>0);
		assert(pos<_size);
		int i = pos;
		for(i; i<_size; i++)
		{
			_data[i] = _data[i+1];
		}
		_size--;
	}
	void Sort()
	{
		int i,j;
		for(i=0; i<_size; i++)
		{
			for(j=0; j<_size-1-i; j++)
			{
				if(_data[j]>_data[j+1])
				{
					T tmp = _data[j];
					_data[j] = _data[j+1];
					_data[j+1] = tmp;
				}
			}
		}
	}
public:
	void CheakCapacity()
	{
		if(_size == _capacity)
		{
			T* tmp = new T[_capacity+3];
			if(TypeTraits::isPODType().Get())
			{
				memcpy(tmp, _data, (_capacity)*sizeof(T));
			}
			else
			{
				for(int i=0; i<_size; i++)
				{
					tmp[i] = _data[i];
				}
			}
			delete[] _data;
			_data = tmp;
			_capacity = _capacity+3;
		}
	}
	void Display()
	{
		int i = 0;
		for(i; i<_size; i++)
		{
			cout<<_data[i]<<" ";
		}
		cout<<"over"<
struct TypeTraits
{
	typedef FalseType isPODType;//內(nèi)嵌型別
};
struct TypeTraits
{
	typedef TrueType isPODType;//內(nèi)嵌型別
};
template<>
struct TypeTraits
{
	typedef TrueType isPODType;//內(nèi)嵌型別
};/*還有許多基本類型沒(méi)有顯示寫出來(lái),bool,float,double...*/

void test6()
{
    SeqList L;
    L.PushBack("11111111111");
    L.PushBack("21111111111");
    L.PushBack("31111111111");
    L.PushBack("41111111111");
    L.PushBack("51111111111");
    L.PushBack("61111111111");
    L.Display();
}

int main()
{
    test6();
    system("pause");
    return 0;
}

結(jié)果:

C++_模板類與類型萃取技術(shù)

模板總結(jié)

    優(yōu)點(diǎn):

        1. 模板復(fù)用了代碼,節(jié)省資源,更快的迭×××發(fā),C++的標(biāo)準(zhǔn)模板庫(kù)(STL)因此而產(chǎn)生。

        2. 增強(qiáng)了代碼的靈活性。

    缺點(diǎn):

        1. 模板讓代碼變得凌亂復(fù)雜,不易維護(hù),編譯代碼時(shí)間變長(zhǎng)。

        2. 出現(xiàn)模板編譯錯(cuò)誤時(shí),錯(cuò)誤信息非常凌亂,不易定位錯(cuò)誤。

類型萃取總結(jié):

        類型萃取技術(shù)可以大大加快代碼的效率,也可以讓思路變得更清晰。

        要是上面在拷貝時(shí),其實(shí)不用memcpy()也可以,只要將對(duì)象一個(gè)一個(gè)的拷貝,也是可行的,但程序的效率就會(huì)大大降低。

        在調(diào)試的時(shí)候會(huì)讓本人思路更加清晰。


分享標(biāo)題:C++_模板類與類型萃取技術(shù)
當(dāng)前路徑:http://weahome.cn/article/pcjsjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部