zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    ES6 promise的用法
    elementUI el-dialog 解决embed标签无法实时更新预览PDF文件
    elementUI upload 上传 传参
    elementUI form表单验证
    Ajax 原理过程 同步与异步区别 优缺点
    《深入理解mybatis原理(十二)》 mybatis深入理解之#与$区别
    截取字符串,含有汉字和字母,不能截半个汉字
    输出一个纯英文字符串中出现次数最左的单词和次数,如果有几个次数最多的单词,全部输出
    极简主义生活方式
    MySQL中创建表指定存储引擎
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468421.html
Copyright © 2011-2022 走看看