C++11关于模板有一些细节的改进:

  • 模板的右尖括号

  • 模板的别名

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

模板的右尖括号

C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割,避免发生编译错误。

int main() {std::vector<std::vector> a; // error   std::vector<std::vector> b; // ok
}

这个我之前都不知道,我开始学编程的时候就已经是C++11的时代啦。

模板的别名

C++11引入了using,可以轻松的定义别名,而不是使用繁琐的typedef。

typedef std::vector<std::vector> vvi; // before c++11
using vvi = std::vector<std::vector>; // c++11

使用using明显简洁并且易读,大家可能之前也见过使用typedef定义函数指针之类的操作,那烂代码我就不列出来了,反正我是看不懂也不想看...以后都可以使用using,额还是列出来吧。

typedef void (*func)(int, int); // 啥玩意,看不懂
using func = void (*)(int, int); // 起码比typedef容易看的懂吧

上面的代码使用using起码比typedef容易看的懂一些吧,但是我还是看不懂,因为我从来不用这种来表示函数指针,用std::function()、std::bind()、std::placeholder()、lambda表达式它不香吗。

函数模板的默认模板参数

C++11之前只有类模板支持默认模板参数,函数模板是不支持默认模板参数的,C++11后都支持。

templateint>class A {    T value;  };
templateint, typename U> // errorclass A {    T value;  };

类模板的默认模板参数必须从右往左定义,而函数模板则没有这个限制。

template <typename R, typename U=int>R func1(U val) {   return val;}
template <typename R=int, typename U>R func2(U val) {   return val;}
int main() {   cout << func1<int, double>(99.9) << endl; // 99   cout << func1<double, double>(99.9) << endl; // 99.9   cout << func1<double>(99.9) << endl; // 99.9   cout << func1<int>(99.9) << endl; // 99   cout << func2<int, double>(99.9) << endl; // 99   cout << func1<double, double>(99.9) << endl; // 99.9   cout << func2<double>(99.9) << endl; // 99.9   cout << func2<int>(99.9) << endl; // 99   return 0;}

对于函数模板,参数的填充顺序是从左到右的。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C++11的模板改进相关推荐

  1. [C++11]对模板右尖括号的优化

    在泛型编程中,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符,而不是模板参数表的结束. C++11改进了编译器的解析规则,尽可能地将多个右尖号( ...

  2. C++11 变参模板

    文章目录 1.概述 2.可变模版参数的展开 2.1变参函数模版 2.1.1递归函数方式展开参数包 2.1.2逗号表达式展开参数包 2.2变参类模版 2.2.1偏特化与递归方式展开 2.2.2继承方式展 ...

  3. c++11 之模板定义别名(using)

    C++11标准中可以为模板定义别名,比如 template<typename T> using ptr=std::shared_ptr<T>; //这里模板定义ptr<T ...

  4. [C++11]函数模板的默认模板参数

    在C++11中添加了对函数模板默认参数的支持. 代码如下: #include<iostream> using namespace std;template<typename T = ...

  5. C++11 函数模板的默认模板参数

    1.函数模板默认模板参数简介 函数模板与类模板在 C++98 一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以.从 C++11 开始,这个限制被解除了,即函数模板同样可以拥有默认模 ...

  6. C++11标准模板(STL)- 算法(std::set_symmetric_difference)

    定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...

  7. C++11标准模板(STL)- 算法(std::nth_element)

    定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...

  8. xbmc_屏幕快照之旅:XBMC 11 Eden Rocks改进了iOS支持,AirPlay甚至是自定义XBMC OS

    xbmc XBMC, the wildly popular, free, and robust open-source media center suite, has a new version. X ...

  9. C++11标准模板(STL)- 算法 - 集合操作(在已排序范围上)(std::set_difference)

    定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...

最新文章

  1. [03]常用正则表达式
  2. outdated: 17.2D Texture Font
  3. [Eclipse]代码已被写入关于如何切换到unix在新行
  4. python average函数详解_python 函数详解
  5. 谷歌看下!罗永浩谈谷歌砍掉平板线 :主要是因为软件太烂
  6. ReentrantLock源码解读
  7. 大一入门oj题目——《三天以后》
  8. 爬取贝壳网深圳二手房实战
  9. 机器学习算法——支持向量机SVM4(SMO算法及KTT条件)
  10. C语言:va_list
  11. 三种编码器技术详解:各有利弊,如何选择?
  12. 导入三方库是出现NotFount
  13. PyTorch学习率衰减策略:指数衰减(ExponentialLR)、固定步长衰减(StepLR)、多步长衰减(MultiStepLR)、余弦退火衰减(CosineAnnealingLR)
  14. 什么是事件驱动架构(EDA)? 一个会写诗的程序员
  15. 屏蔽各类弹窗广告(WPS、智能云输入法)
  16. 我是怎么解决微信封了我们域名的
  17. 空白符号筛选测试真正能用的空白格符号直接复制即可
  18. 如何优雅的关闭Java线程池
  19. 新疆自考大专计算机应用专业,新疆高等教育自学考试专业目录
  20. 维拉智能管家机器人_维拉智能机器人

热门文章

  1. jdbc和jdbc驱动_JDBC布尔兼容性列表
  2. 使用PostgreSQL使用Spring Boot和JPA构建基本应用
  3. java知识回顾_Java7 –回顾
  4. 通过函数式编程实现动态对话框处理程序
  5. 远程调用 quartz_如何远程管理Quartz
  6. 关于ANTLR的通用库的需求:使用反射来构建元模型
  7. 将原生SQL功能Hibernate到您的Spring Data Repository中
  8. 使用Selenide进行有效的UI测试
  9. 使用djcproxy创建代理对象
  10. 云端:亚马逊,谷歌应用引擎,Windows Azure,Heroku,Jelastic