在C++98/03里,我们可以通过typedef 关键字定义一个类型的别名,比如 typedef unsigned int uint_t;在这里我们定义了unsigned int类型的别名和uint_t,在以后需要使用unsigned int的时候我们都可以用uint_t替换,但是uint_t仅仅是作为unsigned int的一个别名,如下的定义是不合法的:

typedef unsigned int uint_t;
void  func(unsigned int);
void  func(uint_t); // error 不合法的重载

上面的func函数是一个不合法的函数重载,虽然使用typedef定义一个类型的别名很方便,但是typedef在使用上存在一些限制,比如说typedef无法重定义一个模板的别名。

考虑下面例子,我们在实际编程中经常使用到STL中的MAP,我们MAP的string类型的数据作为MAP的key,我们想根据STRING类型的KEY映射为一个String,int,long等类型的数据.

typedef std::map<std::string, int> map_t;
//...typedef std::map < std::string, std::string > map_str;
//...

如果需要映射成10中类型的数据,我们就需要利用typedef定义10个具体类型的别名,但是考虑到MAP的key值始终是变的,我们是否像下面一样可以用typedef+模板来定义一个别名呢

template <typename T>
typedef std::map<std::string, T> map;
map<int>  map_i;
map<std::string>  map_str;

遗憾的是上述的定义不能通过编译,也就是C++ 98/03并不支持这样的操作,而通常是通过一个包裹类的方式来实现上述的需求:

template <typename T>
struct alias_map // 包裹类
{typedef std::map<std::string, T> map;
};alias_map<int>::map map_t;
alias_map<int>::map map_str;

通过包裹类的方法虽然可以实现上述的需求,但是一看代码就觉得,这个代码可读性差,不就是定义一个变量吗?还需要整一个包裹类来封装下,增加代码里不说,看着都烦,小幸运的是C++11终于让你可以不用通过上述这种臃肿的方式来实现这个需求了。C++11中,新增了一个特性就是可以通过使用using来为一个模板定义别名,比如说上述的需求,使用C++11就可以这样实现:

template <typename T>
using alias_map = std::map < std::string, T > ;alias_map<int>  map_t;
alias_map<std::string> map_str;

系不系看着舒服很多啊,顿时神清气爽,在C++11中,允许使用using关键字为一个模板来定义别名,实际上using包含了typedef的所有功能,来看下使用using关键字和typedef关键字定义普通类型别名的用法。

typedef unsigned int uint_t;
using uint_t = unsigned int; // using替代typedeftypedef std::map<std::string, int> map_t;
using map_t = std::map < std::string, int >; // using替代typedef

可以看到在对普通类型的别名定义上,两种方法的使用基本等效,唯一不同的仅仅是定义的语法,using使用起来就像是赋值,但是在定义函数函数指针的时候,using看起来可读性要稍微好一点,比如:

typedef void(*func)(int, int);
using func = void(*)(int, int);

可能突然看起来使用using的方式来定义一个函数指针有点怪,但是习惯了之后会发现使用using这种赋值的方式更适用开发人员的思考方式。下面再显示一个通过typedef和using方式分别来定义一个函数模板的例子:

template<typename T>
struct FuncSt // 包裹类
{typedef void(*func)(T, T);
};FuncSt<int>::func func_typedef;template<typename T>
using func_using = void(*func)(T, T);
func_using<int> func_using;

可以看到通过using定义模板别名的语法,仅仅是在普通类型别名语法基础上增加了template参数列表,通过using可以轻松的创建一个模板的别名,而不需要像C++98/03那样增加一个包裹类。但是需要额外注意的是使用using或者typedef仅仅是定义一个别名,不会创造新类型。

C++11 using定义类型别名、模板别名相关推荐

  1. 类模板、变量模板、别名模板 基础知识点二

    基本概念 类模板中的成员函数,只有源程序代码中出现调用这些成员函数的代码时,这些成员函数才会出现在一个实例化了的类模板中. 类模板中的成员函数模板,只有源程序中出现调用这些成员函数模板的代码时,这些成 ...

  2. C++/C++11中用于定义类型别名的两种方法:typedef和using

    类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...

  3. Th4.5:using定义模板别名之详述

    本小节回顾的知识点是using定义模板别名. using(来)定义模板的别名: 在介绍今天要总结的using关键字的"新"功能前,先来介绍一下typedef关键字的用法: type ...

  4. C++——auto、decltype、返回类型后置、模板别名:using =、nullptr

    1.3.声明 1.3.1.auto 以前版本关键字auto是一个存储类型说明符,表示动态存储还是静态存储,与static关键字对应,第九章也写了,C++11将其用实现自动类型推断(第三章).必须显示初 ...

  5. c语言struct结构体类型有关typedef定义的本名和别名

    c语言结构体类型的本名 首先,定义结构体的标准语法为 在c语言中,定义结构体的标准语法是: struct A {}; A是这个结构体的[**本名**].在使用本名定义一个新的结构体时, 必须加上str ...

  6. C语言typedef:给类型起一个别名

    C语言typedef:给类型起一个别名 C语言允许为一个数据类型起一个新的别名,起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样 ...

  7. 【001】C++11允许匿名类型、局部类型作为模板实参

    文章目录 1. C++98 不允许匿名类型.局部类型作为模板实参 2. C++11 支持匿名.句柄类型作模板实参 1. C++98 不允许匿名类型.局部类型作为模板实参 在C++98中,匿名类型(或变 ...

  8. java 定义别名_Java 别名(Aliasing)

    别名 (Aliasing) 别名,顾名思义,是有别于现在名字的另一个名字,但指的是不是同一个人或事物呢?比如,你上学的时候同学有没有给你起什么外号?如果有的话,你的名字和同学给你起的外号是不是都指的是 ...

  9. C++11之decltype类型推导(使用场景、推导四规则、cv限定符)

    系列文章 C++11之正则表达式(regex_match.regex_search.regex_replace) C++11之线程库(Thread.Mutex.atomic.lock_guard.同步 ...

  10. c++模板 --- 类模板、自定义类型当做模板参数

    生成一个类模板 类中用到了未知类型叫做类模板 用 template 修饰的类,这个类就是一个模板类 多用在数据结构中,忽略类型的问题 只要被 template 修饰,就是一个模板类,有没有用未知类型都 ...

最新文章

  1. (Question)CSS中position的绝对定位问题
  2. 案例精解企业网络构建读书笔记之网络故障排除案例
  3. 神级总结:七种功能强大的聊天机器人平台
  4. python可以做什么工作好-学完Python我们可以做什么工作?
  5. centos mysql 5.6.36_CentOS 6.9 升级MySQL 5.6.36到5.7.18
  6. HTTP Session、Cookie机制详解
  7. 【Alpha 冲刺】 2/12
  8. 鸿蒙系统 产品,华为首款鸿蒙系统产品成行业公敌!只因开机无广告:遭十大品牌批评...
  9. php 迭代和递归,实战PHP数据结构基础之递归
  10. 【BZOJ4504】K个串 可持久化线段树+堆
  11. 修改功能(Ajax版)
  12. 【电力电子】功率因素\无功功率
  13. AutoCAD 2022 Mac中文版发布 最好的Mac CAD软件
  14. 虚拟机中标麒麟的网络设置
  15. 非常好用的节假日查询接口
  16. 5.24 通过高级筛选功能将筛选结果放置在其它位置 [原创Excel教程]
  17. 竞赛|全球物联网数据创新大赛
  18. python 中numpy.randon.seed()方法的理解和应用
  19. 【网络安全】网络安全的重要性你知道吗?
  20. 第二本书unit5 lvm管理

热门文章

  1. Node.js 教程第五篇——request
  2. 基于react/vue的移动端终极适配方案(更新css-modules配置)
  3. 2017上半年软考 第十二章 重要知识点
  4. 从vSphere 5.5升级到6之2-升级vCenter Server 5.5到6.0
  5. 2014年最新前端开发面试题(题目列表+答案 完整版)
  6. [导入]js 关联数组 详解
  7. 面向站长和网站管理员的Web缓存加速指南[翻译]
  8. 12.第二节 SAPI概述
  9. 8.1 Zend_View(2)
  10. 2018.01.07软件更新公告