博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11 模板改进
阅读量:3535 次
发布时间:2019-05-20

本文共 1359 字,大约阅读时间需要 4 分钟。

1.1 模板别名

使用场景:
typedef std::map
map_int_t;typedef std::map
map_str_t;
上面的形式在C++98/03中,是不能实现直接。如果要定义如下的模板别名的时候,需要这样写:
template
struct map_str;{ typedef std::map
type;};map_str
::type kk;
从上面可以看出如果要定义上面说的map_str_t别名,就需要外敷一个结构体来实现,这样的实现未免比较麻烦。现在在C++11中已经可以使用重定义一个模板的语法了,如下:
template
using map_str_t = std::map
;map_str_t mm;
这里使用新的using别名语法定义了std::map的模板别名map_str_t。比起之前的使用外敷结构体加上typedef构建的map_str,它完全就像是一个新的map类模板,代码书写上简洁了很多。

1.2 using/typedef比较

而实际上using别名语法覆盖了typedef的全部功能。下面是两种语法的比较:
//重定义unsigned inttypedef unsigned int uint_t;using uint_t = unsigned int;//重定义std::maptypedef std::map
map_str_t;using map_str_t = std::map
;
从上面可以看出,在重定义普通类型上面,两种使用方法的效果是等价的,唯一的不同是定义的语法。
typedef的定义方法和变量的声明类似:像声明一个变量一样,声明一个重定义类型,之后在声明之前加上typedef即可。这种写法凸显了C/C++中的语法一致性,但有时增加了代码的阅读难度,如定义函数指针的时候:
typedef void (*func)(int, int);
与之相比using的表达式就简明了很多
using func = void (*)(int, int);

1.3 函数模板的默认模板参数

C++98/03中可以为类模板指定默认模板参数
template
class A{};
但是对于函数模板的的默认模板参数是不能指定的,或报错。
template
func2(T a){}
上面的在模板函数中的限制在C++11中已经被解除了,上面的func2函数可以直接在C++11中使用。此外函数模板默认模板参数在使用规则上和其他的默认参数也有些不同,因为他没有必须放置在参数表末尾的限制。在调用函数模板时,若显示指定模板的参数,由于参数填充顺序是从参数表的右边开始到左边的。另外,当默认模板参数和模板参数自动推导同时使用时,若函数模板无法自动推导出参数类型,则编译器将使用默认模板参数;否则将使用自动推导出的参数类型。

转载地址:http://kfkhj.baihongyu.com/

你可能感兴趣的文章
IDEA的debug模式
查看>>
创建springboot+mybatis项目详细版全过程
查看>>
git常用命令总结
查看>>
倒计时在ios系统上显示undefine
查看>>
word文档任意位置开始插入页码
查看>>
anaconda常用命令行
查看>>
windows系统上anaconda安装face_recognition
查看>>
NotePress和Word无法关联:MS Word插件安装失败,请确认您的MS Word为Office 2000或更高版本
查看>>
windows上EndNote的安装和使用,使用报错“服务器运行失败”
查看>>
js监听浏览器标签栏切换
查看>>
layui数据表格在ios设备上列宽无限增长的问题
查看>>
常用快捷键整理
查看>>
微信支付wx.requestPayment成功回调函数success里的页面跳转不执行
查看>>
微信小程序(一)代码的编写顺序:先静后动
查看>>
微信小程序(二)template模板的使用
查看>>
微信小程序(三):使用template模板时无法获取for循环下标index的问题
查看>>
微信小程序(四):通过list列表跳转详情页
查看>>
微信小程序(五):上滑加载更多和下拉刷新的实现
查看>>
微信小程序(六):伪tabbar的实现
查看>>
开放API接口
查看>>