c++11改进了编译器的解析规则,尽可能的将多个右尖括号(>)解析为模板参数结束符,方便编写模板相关的代码。

1. 模板的右尖括号

之前的c++标准中,模板套模板中右尖括号不能连在一块,否则会和右移操作符混淆,如 vector< map< int, int> > //右边的两个>要分开。 
而在c++11中,这种限制取消了,编译器能够判断出">>"是右移操作符还是模板参数的结束标记。

2. 模板的别名

之前的c++使用 typedef 来为类型指定别名,在c++11中,可以使用using 来指定别名。

    typedef std::map< std::string, int> map_int_t;
//using map_int_t = std::map<std::string, int>;
typedef std::map< std::string, std::string> map_str_t;
//using map_str_t = std::map< std::string, std::string>;
如果需要指定map的key为std::string, 而value任意,则对于之前的c++,不得不这么做:
template<typename T>
struct str_map{
typedef std::map< std::string, T> type;
};
//....
str_map<int>::type impl;
//在c++11中,使用using进行简化
template<typename T>
using str_map_t = std::map< std::string, T>; //指定类型别名
....
str_map_t<int> map_int_t; //用类型别名定义变量
    使用typedef
typedef void(*func_t)(int, int);
使用using
using func_t = void(*)(int, int);
待模板参数的函数指针
使用typedef
template<typename T>
struct func_t{
typedef void(*type)(T, T);
};
func_t<int>::type xx_1;
使用 using
template<typename T>
using func_t = void(*)(T, T);
func_t xx_2; //声明变量
3. 函数模板的默认参数

在c++98/03中,类模板可以有默认参数,如下:

    template<typename T, typename U = int, U N = 0>
struct Foo{
....
};

但是不支持函数的默认模板参数

    template< typename T = int> //在c++98/03中不被支持
void func(void){
....
};

在c++11中,可以支持函数模板的默认参数

template< typename T = int> //在c++98/03中不被支持
void func(void){
....
};
int main(){
func(); //使用了默认模板参数 int
return 0;
}

当所有模板参数都有默认参数时,函数模板的 调用如同一个普通函数。对于类模板而言,即使所有参数都有默认参数,在使用时也必须在模板名后面跟随<>来实例化。 
    函数模板的默认参数在使用规则上也和其他的默认参数有所区别,例如,没有必须写在参数表最后的位置。同时,没有默认值或者类型的参数,可以自动推导

template<typename R = int, typename U> //默认模板参数没有必须写在参数表最后的位置
R func(U val){
return val;
} int main(void){
func(123); //参数U使用自动推导,推导为int
return 0;
}

在调用函数模板时,若显示指定模板的参数,参数填充顺序从右往左!!

func<long> (123); //参数从右向左填充,则U被视为long类型,则返回的123为long类型
函数模板参数类型自动推导

在C++语言中实现了这一自动推导模板参数值的功能。凡是可以推导出的模板参数“值”,就无需在模板实参列表中写明。 
    另外,当默认模板参数和模板参数自动推导同时使用时,若函数模板无法自动推导出参数类型,则编译器将使用默认模板参数,否则将使用自动推导出的参数类型。即自动推导类型优先。

template<typename T>
void f(T val){
cout << val << endl;
}
tempalte<typename T>
struct identity{
typedef T type;
};
template<typename T = int>
void func(typename identity<T>::type val, T = 0){
..
};
int main(){
f("hello world"); //模板参数自动推导,T 为 const char*
func(123); //T 为int
func(12,12.0); //T 为 double,因为func中的第二个参数为12.0,这样参数模板T就被优先自动推导为double
return 0;
}

c++11——模板的细节改进的更多相关文章

  1. c++11 右尖括号>改进

    c++11 右尖括号>改进 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...

  2. 被Entity Framework Core的细节改进震撼了一下

    今天用 SQL Server Profiler 查看 Entity Framework Core 生成的 SQL 语句时,突然发现一个细节改进,并且被它震撼了一下: exec sp_executesq ...

  3. c++11 模板的别名

    c++11 模板的别名 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  4. 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化

    微信服务号模板消息可以向用户发送重要的服务通知,如信用卡刷卡通知,商品购买成功通知等.昨日,微信团队发布公告称模板消息新增“设置行业”和“添加模板”接口及细节优化,详细变动如下 模板消息[业务通知]自 ...

  5. C++11模板类使用心得

    1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...

  6. 【Ecshop】v2.7.3模板变量标签改进

    改进代码后虽可解决大多数函数参数的问题,但也同样产生了参数问题:ecshop模板函数参数有部分没有被引号包裹,所以正则并不能匹配到,要修改为引号包裹,那是个大工程. 为了使ecshop模板支持date ...

  7. C++11模板的别名

    [C++模板的别名] 参考:http://zh.wikipedia.org/wiki/C++0x#.E6.A8.A1.E6.9D.BF.E7.9A.84.E5.88.A5.E5.90.8D

  8. C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)

    C++有时模板很可能无法处理某些类型的. 例如: #include <iostream> using namespace std; class man{ private: string n ...

  9. C++11模板友元语法

    第 1 类: 普通类A的 普通类B 友元(一对一友好关系): 无需前置声明class B,当class B第一次出现在friend声明中时,该名字被隐式地认为可见. class A { friend ...

随机推荐

  1. QT4.8.5 QComboBox 增加选择菜单记录

    QT4.8.5 QComboBox 增加选择菜单记录 因为软件需要测试多个UART ,多个LAN,当要测试多个同样功能的时候就可以使用QComboBox类实现一个菜单选择功能. 步骤如下: 1. 在U ...

  2. [script]判定某一个脚本是否正确执行

    返回内容存在$?, 0代表成功,其他代表失败 some_command ]; then echo OK else echo FAIL fi 字符型的返回值 some_command retval=$? ...

  3. Win2008 Server系统安装打印服务器与配置

    原文:http://60808.org/thread-20259-1-1.html 视频地址:http://edu.51cto.com/lesson/id-20163.html 本文介绍的是在Win2 ...

  4. 系统优化 /etc/sysctl.conf

    # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl ...

  5. iOS彩票项目--第二天,自定义蒙版、封装活动菜单、自定义pop菜单

    一.自定义蒙版--封装控件,先想好外界怎么来调用,根据外界调用的方法,然后进入内部实现 在外部,调用蒙版的方法--[ChaosCover show]; [ChaosCover hide]; 内部实现 ...

  6. 用jQuery屏蔽掉按回车键时提交表单

    <script type="text/javascript"> $(function() { $("input").keypress(functio ...

  7. 利用VBA宏批量解决Word中图片大小、居中设置

    需求:经常阅读网上的研报(没钱买排版漂亮的高质量研报),有些需要保存的复制下来到word里,图片很大都超出word的边界了,也没有居中,手工一张张调整不现实,上百页的研报,几十张图片. 解决方案:利用 ...

  8. BCM_GPIO驱动测试

    在写内核驱动的时候,最好先在uboot上,进行裸板测试,验证寄存器,再移植到内核中,这样可以熟悉寄存器,也排除内核中的一些干扰. /********************************** ...

  9. Qt Creater中Clang-format的使用

    起因在于习惯性的想格式化代码,发现Qt Creater默认居然是没有代码格式化的,只有一个缩进,搞毛线啊!!! 搜索了下,倒是很容易就搜到了,Qt Creater中有个插件:beautifier,在 ...

  10. WinInet 小例子

    #include <windows.h> #include <wininet.h> #include <string> #include <iostream& ...