typename 與 typedef的區別與應用


typedef

用法:

              關鍵字typedef對內置類型、類類型等進行重命名,使用重命名的類型,在使用上更加方便、簡潔,特別注意:用typedef不會新增類型

實例一:           

	//typedef 簡單例子
	typedef unsigned short Word;//對unsigned short內置類型進行重命名
	Word wClickNum  = 10;	//用用戶定義的新名字定義變量 等同於unsigned short wClickNum</span>

 實例二:

	//普通方式:定義結構體類型與變量
	struct tag_Student
	{
		string   strName;
		unsigned short usMathResult;
	};
	
	struct tag_Student stStudent1;
	
	//使用typedef可以使結構體定義更簡潔
	typedef struct
	{
		string   strName;
		unsigned short usMathResult;
	}stStudent;

	stStudent stPerson;//定義變量更加簡潔

typename

用法:

              關鍵字typename用來作為型別之前的標識符,主要應用在函數模板、類模板中,在template中也可以用class來聲明。

函數模板

         我們可以定義一個通用的函數模板,而不是為每個類型都定義一個新函數,一個函數模板就是一個公式,可以生成特性類型的函數版本。

例子一

template <typename T>
int Compare(const T& V1, const T& V2)
{
	if (V1 < V2)
	{
		return -1;
	} 
	else if (V1 > V2)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	//調用一個函數模板時,通用編譯器根據函數模板的實參來為我們推到T的類型
	int nRet1 = Compare(10, 11);  //實例化函數模板,T為int類型
	int nRet2 = Compare(9.1, 9.8);//實例化函數模板,T為float 類型
	
	return 0;
}

例子二

      例子二的函數模板將在后續的博文中多次引用。
#include <iostream>
//打印容器內的所用元素
template<class T>
inline void PrintElements(const T& coll, const char* optcstr = "")
{
	//告訴編譯器pos是某個類型容器的迭代器,調用PrintElements函數時確定型別
	typename T::const_iterator pos;
	std::cout << optcstr;
	for (pos = coll.begin(); pos != coll.end(); ++pos)
	{
		std::cout << *pos << ' ';
	}

	std::cout << std::endl;
}
.....

//定義容器
vector<int> iVector;
for (int i = 0; i < 9; ++i)
{
	iVector.push_back(i);
}
//調用函數模板
PrintElements(iVector,"vector :");

類模板:

例子三

       類模板和函數模板基本使用上基本一樣,只是類模板
	//STL中定義的模板類型
	//int 是 vector<T> 模板參數
	//iterator 是 vector<int>的迭代器類型
	vector<int> iVector;
	vector<int>::iterator it1;
	list<float> flist;
	list<float>::iterator it2;

綜合應用

     代碼如下:
template<class T>
class MyClass
{
public:
	typedef typename T::SubType A;

public:
	A a;
}
       typedef typename T::SubType A;的含義是: A是某個類中的SubType類型,通過typedef來修飾,A為SubType類型的別名。typename是型別標識符
     特別的, 如果  有typename T::SubType *A語句中沒有typename 修飾,該語句將被翻譯成:SubType 與ptr的乘積,編譯將會出錯。”::“表示域標識符

例子四

template<class T>
class MyClass
{
public:
	typedef typename T::SubType A;

public:
	A a;

public:
	//默認構造函數
	MyClass()
	{
		a = 10;
	}

	void PrintNum()
	{
		cout << "a = " << a << endl;
	}

};

class Q
{
public:
	//指定類Q中SubType類型
	typedef int SubType;
};

int _tmain(int argc, _TCHAR* argv[])
{
	//自定義模板, typedef、typename綜合運用
	MyClass<Q> object;//實例類模板
	object.PrintNum();
	return 0;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM